为啥`XmlDocument.LoadXml()`不适用于命名空间?

Posted

技术标签:

【中文标题】为啥`XmlDocument.LoadXml()`不适用于命名空间?【英文标题】:Why does `XmlDocument.LoadXml()` not work with namespace?为什么`XmlDocument.LoadXml()`不适用于命名空间? 【发布时间】:2018-11-17 01:07:05 【问题描述】:

我有一个写成字符串的 XML 标记:

<w:sym w:font="Wingdings" w:char="F0FE"/>

我想从字符串创建一个 XML 标记,而不使用 AddAttribute() 等显式方法。所以我使用 XmlDocument.LoadXml(),如下所示:

XmlDocument doc = new XmlDocument();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
doc.LoadXml(@"<w:sym w:font=""Wingdings"" w:char=""F0FE""/>");

LoadXml() 正在抛出一个异常,指出前缀“w”未定义。

当我使用NameTable 定义命名空间时,这让我感到惊讶。

这里有什么问题?


编辑:我看到很多解释如何读取片段的答案,但我没有找到解释如何处理命名空间的答案。

【问题讨论】:

命名空间前缀只有 local 含义。仅仅因为在 C# 代码的“外部”上下文中,您已经确定了一个命名空间并为其使用了 w 前缀,这与分配的任何 w 前缀没有关系文档中您正在尝试加载。 @Damien_The_Unbeliever,谢谢你的解释。可以假设XmlDocument.NameTable 是在任何情况下在解析XML 时查找名称空间的可靠参考。正如您所解释的那样,事实证明这是错误的。 LINQ to XML - Load XML fragments from file的可能重复 【参考方案1】:

这里不是解释为什么它不适用于.NameTable,而是如何实现目标的解决方法。

将您的标签包装在另一个标签中并在那里定义工作区,如下所示:

String fullTagToRead = 
  @"<document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">" 
+ @"<w:sym w:font=""Wingdings"" w:char=""F0FE""/>" 
+ @"</document>")

像这样,LoadXml() 就像一个魅力。甚至不需要编写 XML 声明标签。

【讨论】:

LoadXML 用于在您拥有片段时读取整个 XML 文档。这确实修复了无效片段。有多个副本显示如何通过 XmlReader 通过将其一致性级别设置为片段来读取片段

以上是关于为啥`XmlDocument.LoadXml()`不适用于命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

.NET XmlDocument LoadXML 和实体

试图解析 xml,但 xmldocument.loadxml() 正在尝试下载?

原创XmlDocument.LoadXml和Load的区别

不使用 XmlDocument.Loadxml() 函数将 XML 反序列化为 JSON

XmlDocument.selectNodes() and selectSingleNode()的xpath的学习资料

你应该同步运行方法吗?为啥或者为啥不?