用 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”的“”替换为匹配的“&lt;
”“&gt;
”?
注意我的文件很大,标签很多...
谢谢!
【问题讨论】:
【参考方案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 整洁。在将其转换为如果这个文件真的很大,那么你应该使用 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 标记的主要内容,如果未能解决你的问题,请参考以下文章