C# 在C中查找具有命名空间的xml文档中的特定节点
为了解决我的问题,我尝试了很多答案。但在我的XML文档中似乎没有一个能起作用 这是我的XMLC# 在C中查找具有命名空间的xml文档中的特定节点,c#,xml,xml-namespaces,C#,Xml,Xml Namespaces,为了解决我的问题,我尝试了很多答案。但在我的XML文档中似乎没有一个能起作用 这是我的XML <w:wordDocument xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns
<w:wordDocument xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core"
w:macrosPresent="no"
w:embeddedObjPresent="no"
w:ocxPresent="no"
xml:space="preserve">
<w:ignoreSubtree
w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2" />
...
<w:body>
<w:p
wsp:rsidR="009D1011"
wsp:rsidRDefault="001D7CCD">
...
但是myNode总是返回null
有人能告诉我我做错了什么吗?您的代码有问题:
要获取用于给定前缀w的名称空间,在这种情况下,您应该检查正确的xmlns:w属性而不是默认的xmlns,或者检查一些随机的属性,如xmlns:alm,或者在大多数情况下只是显式指定,例如,在有效的WordML文档中,它永远不会更改。
要选择从根开始的元素,您需要使用从根开始的XPath搜索/w:。。。。或者在根元素本身作为子文档的节点上执行选择。
工作代码的可能变体:
xmlNamespace = Convert.ToString(nodeInfo[0].Attributes["xmlns:w"].Value);
nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("w", xmlNamespace);
XmlNode myNode = xml.SelectSingleNode("w:wordDocument/w:body", nsmgr);
或
或直接忽略具有本地名称功能的名称空间:
XmlNode myNode = xml.SelectSingleNode(
"/*[local-name()='wordDocument']/*[local-name()='body']", nsmgr);
@阿列克谢列文科夫,我在没有反洗钱的情况下也尝试过。不起作用。因此,即使您硬编码正确的命名空间,如nsmgr.AddNamespacew,http://schemas.microsoft.com/office/word/2003/wordml 它不起作用??我假设您理解xmlns的含义:。。属性,否则您的问题应该完全不同,可能会偏离主题SO@AlexeiLevenkov我也试过了。还是一样。
nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("w", "http://schemas.microsoft.com/office/word/2003/wordml");
XmlNode myNode = xml.DocumentElement
.SelectSingleNode("/w:wordDocument/w:body", nsmgr);
XmlNode myNode = xml.SelectSingleNode(
"/*[local-name()='wordDocument']/*[local-name()='body']", nsmgr);