用 html 值替换 xml 标记

Posted

技术标签:

【中文标题】用 html 值替换 xml 标记【英文标题】:replacing xml tag with html value 【发布时间】:2011-01-07 01:36:38 【问题描述】:

我正在使用 c# .Net

我有一个问题,

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

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

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

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

注意我的文件很大,标签很多...

谢谢!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

嗨! HttpUtility.HtmlEncode 没有对文件做任何事情。关于 CDADA 我的问题是如何轻松找到有问题的标签...【参考方案2】:

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

但是,如果它真的是开放式的,如果 any 标签可以是未封闭的,那么您将需要使用类似HTML Tidy 的东西。 .Net 包装器可以是found here。有了这个解决方案,<deg> 标签将被转换为<deg/>。 HTML Tidy 包装器还可以修复一些其他导致 xml 格式错误的问题。

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

【讨论】:

不错的答案...我没有已知的标签列表...它可以是任何标签。我将尝试使用 html 整洁。在将其转换为 之后(找到它们会容易得多),我将再次将其转换为 我认为这可能会奏效。希望这个图书馆对我有用。 (我的文件实际上是SGML格式) :)。我无论如何都会,但让我们等待更多的答案。我要解决!!!还有很多像你这样的专家可以给我一些更好的答案。【参考方案3】:

如果这个文件真的很大,那么你应该使用 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

【讨论】:

文件实际上是 SGML 格式。 (这就是为什么我没有使用 xDoc.LoadXml)从 XmlDocument 更改为 XmlReader 对我有什么帮助? 谢谢!我明天早上会试着检查一下,让你知道:) 我已经为此苦苦挣扎了一段时间。 :) 那么,如果您使用 xmlReader 阅读它,它会识别未封闭的标签,然后将其转换为 xmlDocument 或 XDocument 或其他什么,您将拥有封闭标签?【参考方案4】:

标准正则表达式免责声明在这里...... - 有时它们可以派上用场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 是清理任何格式错误的内容的替代选项。如果您知道内容,您可以进去并用有效的结束标签替换它们。

【讨论】:

嗨!感谢您的回答...您的样本确实对我有用。但它不适用于我的文件。虽然我认为你的答案非常接近,并且有很大帮助。我的文件是 SGML 格式。当我尝试使用您的示例时,我得到“根级别的数据无效。第 1 行,位置 1。” (这就是为什么我没有从一开始就使用 LoadXml ......)。也许可以了解如何将 SGML 转换为 Xml,然后使用您的解决方案,它将解决我的问题。 @Jack 你试过只使用Load(filename) 吗?您是在加载字符串还是文件?您的原始代码显示了一个文件名,而我使用的是一个字符串,所以只是为了确保我们都在同一个页面上。另外,您的 SGML 文件的开头是什么样的?也许您可以使用 SGML 文件的小样本更新您的问题。

以上是关于用 html 值替换 xml 标记的主要内容,如果未能解决你的问题,请参考以下文章

Index.html 脚本标记值在运行时被替换

如何在 c# 中替换 xml 开始标记和 xml 结束标记之间的内容?

用 mule 中的其他值替换 xml 特定节点元素值

C# 正则表达式:将空格替换为 XML 标记

将查询参数替换为另一个值/标记

用 pom.xml 中的值替换占位符名称