我正在使用c#.Net
我有一个问题,
我正在使用XDocument.xDoc.Load(file)
加载Xml文件,但它失败了,因为在我的内容中我还有xml标记:
示例:<root><abc><deg></abc></root>
我的问题是Load
函数将<deg>
视为Xml标记而没有匹配的“</deg>
”...
我的问题是,如何更换“&lt;”和“&gt;”最简单的方式是匹配“<
”“>
”的“deg”?
N.B。我的文件很大,我有很多标签...
谢谢!
答案 0 :(得分:2)
除非您想要进行大量难以解析,否则您尝试做的事情很难用标准.NET库完成。如果你的非结束标签有任何押韵或理由,它会有很大帮助。例如,是否有已知的标签列表未关闭?如果是这样,搜索和替换就不会坏。
但是,如果它真的是开放式的,如果任何标记都可能未公开,那么您需要使用类似HTML Tidy的内容。这个.Net包装器可以是found here。有了这个解决方案,<deg>
标记将转换为<deg/>
。 HTML Tidy包装器还可以解决导致xml 格式错误的一些其他问题。
一旦您的文件包含格式良好的xml,您就可以轻松地将其加载到xml对象中。然后,如果您还有其他工作要做,那么您至少可以将其视为为xml。
答案 1 :(得分:1)
标准的正则表达式免责声明在这里... - 有时候它们可以派上用场HTML cleanup scenarios。
尝试这种方法:
string input = "<root><abc><deg><foo></abc><bar></root>";
string pattern = @"(<(?<tag>\w+)>)(?!.*?</\k<tag>>)";
string result = Regex.Replace(input, pattern,
match => HttpUtility.HtmlEncode(match.Value));
XDocument document = XDocument.Parse(result);
Console.WriteLine(document.ToString());
当然要注意文件大小,如果性能对整个过程很重要,其他建议可能会更合适。
编辑: Html Agility Pack是清除任何格式错误内容的备用选项。如果您知道可以进入的内容并将其替换为有效的结束标记。
答案 2 :(得分:0)
如果您可以在将其加载到XmlDocument
之前获取该部分,那么您可以使用HttpUtility.HtmlEncode
方法为您实体转义内容。
您可能需要考虑的另一件事是将看起来像XML的内容包装为CDATA
,这将有效地将此内容隐藏在解析器中。
答案 3 :(得分:0)
如果此文件非常大,那么您应该使用XmlReader而不是XmlDocument,并且没有“未关闭标记”问题。
http://msdn.microsoft.com/en-us/library/system.xml.xmlreader%28VS.80%29.aspx