Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在从XML名称标记中删除无效字符-正则表达式C#_C#_Xml_Regex - Fatal编程技术网

正在从XML名称标记中删除无效字符-正则表达式C#

正在从XML名称标记中删除无效字符-正则表达式C#,c#,xml,regex,C#,Xml,Regex,我从web服务中提取了一个包含xml数据的字符串。数据很难看,在xml的名称标记中有一些无效字符。例如,我可能会看到如下内容: <Author>Scott the Coder</Author><Address#>My address</Address#> Scott代码地址 地址名称字段中的#无效。我正在寻找一个正则表达式,它将从name标记中删除所有无效字符,但将所有字符保留在xml的Value部分。换句话说,我想使用正则表达式仅从开始名标记

我从web服务中提取了一个包含xml数据的字符串。数据很难看,在xml的名称标记中有一些无效字符。例如,我可能会看到如下内容:

<Author>Scott the Coder</Author><Address#>My address</Address#>
Scott代码地址
地址名称字段中的#无效。我正在寻找一个正则表达式,它将从name标记中删除所有无效字符,但将所有字符保留在xml的Value部分。换句话说,我想使用正则表达式仅从开始名标记和结束名标记中删除字符。其他一切都应该保持不变

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


有可能完成我想做的吗?

我有一个简单的表单,有两个文本区域和一个按钮。这似乎奏效了

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 ""; }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用System.Text.RegularExpressions;
命名空间Windows窗体应用程序3
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{

Regex r=new Regex(@“(?Regex是一个有问题的方法,除非你真的只有一个文件要处理。痛苦、沮丧、bug是你在那里的未来

如果您真的想使用正则表达式,我在Perl中使用了一些有用的正则表达式

您考虑过使用解析器吗

需要考虑的两个问题:


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

如果您只想检查Xml节点名称的有效性,我建议您查看
XmlConvert
类;尤其是
VerifyName
VerifyNCName
方法

还请注意,使用该类,您可以使用
EncodeName
EncodeLocalName
方法接受任何文本作为节点名

使用这些方法将比执行正则表达式更简单、安全和快速。

尝试以下方法:

s = Regex.Replace(s, @"[#{}&()]+(?=[^<>]*>)", "");
s=Regex.Replace(s,@“[{}&()]+(?=[^]*>)”,“”);
如果向前看成功,则匹配后的下一个角括号是右尖括号(
),表示匹配发生在标记内部


当然,这假定文本的格式合理,并且除了标记中的尖括号外,它不包含尖括号。

您可以使用字符串替换替换所有无效的字符。 通常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();
这将清除正则表达式中指定的字符。

我试图避免多次搜索字符串,因为字符串可能很大。但是,如果我找不到一种干净的正则表达式方法,我将不得不花一些时间编写一个语法分析器来实现这一点。我现在更明白了。这似乎会有所帮助:(我的意思是向前看,向后看,而不是perl部分).Ok为c#regexp找到了它们:(?=…)正向前瞻(?!…)反向前瞻(?我不确定这些字符是否对标记名有效,但如果不是,您可能无法解析xml(事实上,这可能是导致此问题的原因)。如果您可以解析它,就不必真正修复它。值得尝试使用不同的解析器。实际上,XMLDocument就是我的问题所在。当xmlDoc.LoadXml(xmlString)时,XMLDocument抛出。在通过解析器运行之前,我需要对其进行修复。除非我不知道XMLDocument的某些方面,否则我不会以这种方式使用它???@Kobi所有这些字符在元素名称中都是无效的。任何符合要求的XML解析器都不会接受此输入。最好避免引用“XML数据”之类的内容"。这不是XML。这就是为什么你会遇到问题。你需要让数据供应商意识到他们的输出是垃圾。是的,这就是我需要做的。没有理由在解决问题时尝试简化留言板上的内容。我应该找到做这件事的人,告诉他他是个坏孩子。这会解决我的问题em….呃,等等,不..我仍然有同样的问题…下一步!您可能希望向不允许的字符添加
$
。请注意,Verify*Name方法会引发一个异常,这将是性能命中。我认为这个正则表达式在“x10FFFF”之前缺少“\”。例如,它不会删除\x10