用html值替换xml标记

时间:2010-01-19 23:24:26

标签: c# xml html-parsing xmldocument linq-to-xml

我正在使用c#.Net

我有一个问题,

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

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

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

我的问题是,如何更换“&lt;”和“&gt;”最简单的方式是匹配“&lt;”“&gt;”的“deg”?

N.B。我的文件很大,我有很多标签...

谢谢!

4 个答案:

答案 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

实施例: How to do streaming read of a large XML file in C# 3.5