4

我正在使用 c# .Net

我有个问题,

我正在加载 Xml 文件XDocument.xDoc.Load(file),但它失败了,因为在我的内容中我也有 xml 标签:

例子:<root><abc><deg></abc></root>

我的问题是该Load函数将<deg>视为 Xml 标记而没有匹配的“ </deg>”...

我的问题是,如何以最简单的方式将“deg”的“<”和“>”替换为匹配的“ &lt;”“ &gt;”?

注意我的文件很大而且我有很多标签...

谢谢!

4

4 回答 4

2

您尝试做的事情很难用标准的 .NET 库来做,除非您想做很多困难的解析。如果您的非结束标签有任何押韵或理由,那将有很大帮助。例如,是否存在已知的未关闭标签列表?如果是这样,搜索和替换就不错了。

但是,如果它真的是开放式的,如果任何标签都可以打开,那么您将需要使用HTML Tidy之类的东西。可以在此处找到.Net 包装器。有了这个解决方案,<deg>标签将被转换为<deg/>. HTML Tidy包装器还可以修复一些导致 xml 格式错误的其他问题。

一旦您的文件包含格式良好的 xml,您就可以轻松地将其加载到 xml 对象中。然后,如果您对文档还有其他工作要做,您至少可以将视为 xml。

于 2010-01-19T23:56:54.553 回答
1

标准正则表达式免责声明在这里...... -有时它们可​​以在HTML 清理场景中派上用场。

试试这种方法:

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是清理任何格式错误的内容的替代选项。如果您知道内容,您可以进去并用有效的结束标签替换它们。

于 2010-01-20T00:09:52.373 回答
0

如果您可以在将其加载到该部分之前到达该部分,XmlDocument那么您可以使用该HttpUtility.HtmlEncode方法为您实体转义内容。

您可能要考虑的另一件事是将看起来像 XML 的内容包装为CDATA,这将有效地向解析器隐藏此内容。

于 2010-01-19T23:27:09.333 回答
0

如果这个文件真的很大,那么你应该使用 XmlReader 而不是 XmlDocument 并且不存在“未关闭标签”的问题。

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader%28VS.80%29.aspx

示例: 如何在 C# 3.5 中对大型 XML 文件进行流式读取

于 2010-01-20T00:05:11.057 回答