C# 为什么`XmlDocument.LoadXml()`不能与命名空间一起使用?

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

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

<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来读取片段