我需要找出一种很好的方法,使用C#解析(NULL)
的XML文件并将其从标记中删除,并将其替换为单词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文件来测试这些代码,但它已经对每个文件都有效,并没有删除好的数据。我很感激您的反馈和时间。
答案 0 :(得分: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");
答案 1 :(得分:0)
您是否适合将此XML作为字符串读取并执行正则表达式替换?像:
Regex nullMatch = new Regex("<(.+?)_\\(NULL\\)(.+?)>");
String processedXmlString = nullMatch.Replace(originalXmlString, "<$1_BAD$2>");