繁体   English   中英

c#从XML标记中删除(空)

[英]c# remove (null) from XML tags

我需要找出一种使用C#解析(NULL)的XML文件并将其从标记中删除并将其替换为BAD

例如:

<GC5_(NULL) DIRTY="False"></GC5_(NULL)>

应该替换为

<GC5_BAD DIRTY="False"></GC5_BAD>

问题的一部分是我无法控制原始XML,我只需要在收到原始XML后对其进行修复。 第二个问题是(NULL)可以出现在零个,一个或多个标签中。 用户是否填写其他字段似乎是一个问题。 所以我可能会得到

<GC5_(NULL) DIRTY="False"></GC5_(NULL)>

要么

<MH_OTHSECTION_TXT_(NULL) DIRTY="False"></MH_OTHSECTION_TXT_(NULL)>

要么

<LCDATA_(NULL) DIRTY="False"></LCDATA_(NULL)>

我是C#和编程的新手。

编辑:所以我想出了以下功能,虽然还不很漂亮,但到目前为止仍能正常工作。

public static string CleanInvalidXmlChars(string fileText)
    {
        List<char> charsToSubstitute = new List<char>();
        charsToSubstitute.Add((char)0x19);
        charsToSubstitute.Add((char)0x1C);
        charsToSubstitute.Add((char)0x1D);
        foreach (char c in charsToSubstitute)
            fileText = fileText.Replace(Convert.ToString(c), string.Empty);

        StringBuilder b = new StringBuilder(fileText);
        b.Replace("&#x0;", string.Empty);
        b.Replace("&#x1C;", string.Empty);
        b.Replace("<(null)", "<BAD");
        b.Replace("(null)>", "BAD>");

        Regex nullMatch = new Regex("<(.+?)_\\(NULL\\)(.+?)>");
        String result = nullMatch.Replace(b.ToString(), "<$1_BAD$2>");

        result = result.Replace("(NULL)", "BAD");

        return result;
    }

我只能找到6或7个错误的XML文件来测试此代码,但是它对每个文件都起作用,并且没有删除好的数据。 感谢您的反馈和宝贵的时间。

通常,正则表达式不是处理XML文件的正确方法。 有一系列解决方案可以正确处理XML文件-您可以在System.Xml.Linq上阅读以获取良好的开始。 如果您是新手,那肯定是您应该在某个时候学到的东西。 但是,正如Ed Plunkett在评论中指出的那样,您的XML实际上不是XML:XML元素名称中不允许使用()字符。

由于您必须将其作为对字符串的操作来完成,因此要使用Corak的注释

contentOfXml.Replace("(NULL)", "BAD");

可能是个好主意,但是如果任何元素可以包含字符串(NULL)作为其名称以外的其他名称,它就会中断。

如果您想使用正则表达式,则可能效果不错,但是我不确定它是否没有遗漏任何边缘情况:

var regex = new Regex(@"(<\/?[^_]*_)\(NULL\)([^>]*>)");
var result = regex.Replace(contentOfXml, "$1BAD$2");

将这个XML读取为字符串并执行正则表达式替换是否合适? 喜欢:

Regex nullMatch = new Regex("<(.+?)_\\(NULL\\)(.+?)>");
String processedXmlString = nullMatch.Replace(originalXmlString, "<$1_BAD$2>");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM