C# 为什么`XmlDocument.LoadXml()`不能与命名空间一起使用?
我有一个写为字符串的XML标记:C# 为什么`XmlDocument.LoadXml()`不能与命名空间一起使用?,c#,asp.net,.net,xml,C#,Asp.net,.net,Xml,我有一个写为字符串的XML标记: <w:sym w:font="Wingdings" w:char="F0FE"/> LoadXml()引发异常,表示未定义前缀“w” 当我用NameTable定义名称空间时,这让我感到惊讶 这里有什么问题 编辑:我看到了很多解释如何读取片段的答案,但我没有找到一个解释如何处理名称空间的答案。这里不是解释为什么它不能与.NameTable一起使用,而是一个如何实现目标的解决方法 将标记包装到另一个标记中,并在其中定义工作区,如下所示: XmlDoc
<w:sym w:font="Wingdings" w:char="F0FE"/>
LoadXml()
引发异常,表示未定义前缀“w”
当我用NameTable
定义名称空间时,这让我感到惊讶
这里有什么问题
编辑:我看到了很多解释如何读取片段的答案,但我没有找到一个解释如何处理名称空间的答案。这里不是解释为什么它不能与
.NameTable
一起使用,而是一个如何实现目标的解决方法
将标记包装到另一个标记中,并在其中定义工作区,如下所示:
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""/>");
String fullTagToRead =
@"<document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">"
+ @"<w:sym w:font=""Wingdings"" w:char=""F0FE""/>"
+ @"</document>")
String fullTagToRead=
@""
+ @""
+ @"")
像这样,
LoadXml()
工作起来很有魅力。甚至不需要编写XML声明标记。名称空间前缀仅具有本地含义。只是因为在C代码的“外部”上下文中,您标识了一个名称空间并使用了w
前缀,这与您试图加载的文档中分配的w
前缀没有任何关系。@Damien_不信者,谢谢您的解释。可以假定XmlDocument
的.NameTable
是在解析XML时在任何情况下查找名称空间的可靠参考。正如您所解释的,这是错误的。LoadXML
的可能副本意味着在您有一个片段时读取整个XML文档。这确实修复了无效的片段。有多个副本显示了如何通过XmlReader将其Conformge级别设置为fragment来读取片段