猿问

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

我需要找出一种使用 C# 解析 XML 文件的好方法(NULL),并将其从标签中删除,然后将其替换为单词BAD.


例如:


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

应该替换为


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

部分问题是我无法控制原始 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 文件来测试此代码,但它对每个文件都有效,并且没有删除好的数据。我感谢您的反馈和您的时间。


三国纷争
浏览 253回答 2
2回答

梦里花落0921

将此 XML 作为字符串读取并执行正则表达式替换是否适合您?喜欢:Regex nullMatch = new Regex("<(.+?)_\\(NULL\\)(.+?)>");String processedXmlString = nullMatch.Replace(originalXmlString, "<$1_BAD$2>");

肥皂起泡泡

通常,正则表达式不是处理 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");
随时随地看视频慕课网APP
我要回答