为啥`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()`不适用于命名空间?的主要内容,如果未能解决你的问题,请参考以下文章
试图解析 xml,但 xmldocument.loadxml() 正在尝试下载?
不使用 XmlDocument.Loadxml() 函数将 XML 反序列化为 JSON