Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中查找具有命名空间的xml文档中的特定节点_C#_Xml_Xml Namespaces - Fatal编程技术网

C# 在C中查找具有命名空间的xml文档中的特定节点

C# 在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

为了解决我的问题,我尝试了很多答案。但在我的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: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);