我需要找出一种使用 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("�", string.Empty); b.Replace("", 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 文件来测试此代码,但它对每个文件都有效,并且没有删除好的数据。我感谢您的反馈和您的时间。
2 回答
梦里花落0921
TA贡献1772条经验 获得超6个赞
将此 XML 作为字符串读取并执行正则表达式替换是否适合您?喜欢:
Regex nullMatch = new Regex("<(.+?)_\\(NULL\\)(.+?)>");
String processedXmlString = nullMatch.Replace(originalXmlString, "<$1_BAD$2>");
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
通常,正则表达式不是处理 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");
- 2 回答
- 0 关注
- 252 浏览
添加回答
举报
0/150
提交
取消