从XML名称标记中删除无效字符 - RegEx C#

时间:2011-01-24 04:41:20

标签: c# xml regex

我有一个带有xml数据的字符串,我是从Web服务中提取的。数据很难看,并且在xml的Name标签中有一些无效的字符。例如,我可能会看到类似的内容:

<Author>Scott the Coder</Author><Address#>My address</Address#>

地址名称字段中的#无效。我正在寻找一个正则表达式,它将从名称标签中删除所有无效字符但是将所有字符保留在xml的Value部分中。换句话说,我想使用RegEx仅从开头名称标签和结束名称标签中删除字符。其他一切都应该保持不变。

我还没有所有无效的字符,但这会让我开始:#{}&amp;()

我可以做我想做的事吗?

5 个答案:

答案 0 :(得分:5)

如果您的目的是仅检查Xml节点名称的有效性,建议您查看XmlConvert类;尤其是VerifyNameVerifyNCName方法。

另请注意,使用该类,您可以使用EncodeNameEncodeLocalName方法接受任何文本作为节点名称。

使用这些方法将比执行正则表达式更容易,更安全,更快捷。

答案 1 :(得分:1)

我有一个简单的表单,有两个文本区域和一个按钮。这似乎可以解决问题。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Regex r = new Regex(@"(?<=\<\w+)[#\{\}\(\)\&](?=\>)|(?<=\</\w+)[#\{\}\(\)\&](?=\>)");
            textBox2.Text = r.Replace(textBox1.Text, new MatchEvaluator(deleteMatch));
        }

        string deleteMatch(Match m) { return ""; }
    }
}

答案 2 :(得分:1)

RegEx是一个有问题的方法,除非你真的只有一个文件要处理。痛苦,沮丧,错误是你的未来......

真的想要使用RegEx,我在Perl中使用了有用的HERE

您是否考虑过使用解析器?

两个要考虑:

LINQ for XML

XmlDocument

解析后,您可以重新保存麻烦的部分,或者只是以编程方式继续。

答案 3 :(得分:1)

试试这个:

s = Regex.Replace(s, @"[#{}&()]+(?=[^<>]*>)", "");

如果前瞻成功,则匹配后的下一个尖括号为右对齐(>),表示匹配发生在标记内。

当然,这假定文本格式合理,除了标签中的角度之外,它不包含尖括号。

答案 4 :(得分:1)

您可以使用字符串替换来替换所有无效的字符。 通常,ascii控制字符会在XML读取中产生问题。

避免使用此功能

     public static string CleanInvalidXmlChars( this string text)
    {
        // From xml spec valid chars:
        // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]    
        // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
        string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]";
        return Regex.Replace(text, re, "");
    }


     xmlcontent = xmlcontent.CleanInvalidXmlChars();

这将清除正则表达式中指定的chracters。 i get this from this site

相关问题