XPathSelectElement始终返回null [英] XPathSelectElement always returns null

查看:207
本文介绍了XPathSelectElement始终返回null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么使用XDocument.XPathSelectElement



的XPath不工作这个XPath:

  //插件/ UI [1] / PluginPageCategory [1] /页[1] /组[1] / CommandRef [2] 

XML

 <插件的xmlns =HTTP://www.MyNamespace .CA / mypath中> 
< UI>
< PluginPageCategory>
<页面和GT;
<组>
< CommandRef>
<图像及GT;
< /图片>
< / CommandRef>
< CommandRef>
<图像及GT;
< /图片>
< / CommandRef>
< /组>
< /页>
< / PluginPageCategory>
< / UI>
< /插件>



C#代码:

  myXDocument.XPathSelectElement(//插件/ UI [1] / PluginPageCategory [1] /页[1] /组[1] / CommandRef [2],myXDocument.Root.CreateNavigator()); 


解决方案

在使用的命名空间,这些都必须在使用XPath查询也。您的XPath查询将只针对没有命名空间的元素作品(可以通过从你的XML命名空间进行验证)。



下面是向您展示如何创建并传递一个例子命名空间管理:

  VAR XML = ... XML从您的帖子...; 

变种的XMLReader = XmlReader.Create(新StringReader(XML)); //或任何你的来源是的,当然。
VAR myXDocument = XDocument.Load(XMLReader的);
变种namespaceManager =新的XmlNamespaceManager(xmlReader.NameTable); //现在,我们在文档中使用的命名空间,它知道一个名称空间经理。
namespaceManager.AddNamespace(前缀,http://www.MyNamespace.ca/MyPath); //我们增加对我们的查询一个明确的前缀映射。

VAR的结果= myXDocument.XPathSelectElement(
//前缀:插件/前缀:UI [1] /前缀:PluginPageCategory [1] /前缀:第[1] /前缀:组[1] /前缀:CommandRef [2],
namespaceManager
); //我们反对使用在查询中的元素前缀。

Console.WriteLine(结果); //< CommandRef ...>元件被打印。



希望这有助于。


Why is this Xpath not working using XDocument.XPathSelectElement?

Xpath:

//Plugin/UI[1]/PluginPageCategory[1]/Page[1]/Group[1]/CommandRef[2]

XML

<Plugin xmlns="http://www.MyNamespace.ca/MyPath">
  <UI>
    <PluginPageCategory>
      <Page>
        <Group>
          <CommandRef>
            <Images>
            </Images>
          </CommandRef>
          <CommandRef>
            <Images>
            </Images>
          </CommandRef>
        </Group>
      </Page>
    </PluginPageCategory>
  </UI>
</Plugin>

C# Code:

myXDocument.XPathSelectElement("//Plugin/UI[1]/PluginPageCategory[1]/Page[1]/Group[1]/CommandRef[2]", myXDocument.Root.CreateNavigator());

解决方案

When namespaces are used, these must be used in the XPath query also. Your XPath query would only work against elements with no namespace (as can be verified by removing the namespace from your XML).

Here's an example showing how you create and pass a namespace manager:

var xml = ... XML from your post ...;

var xmlReader = XmlReader.Create( new StringReader(xml) ); // Or whatever your source is, of course.
var myXDocument = XDocument.Load( xmlReader );
var namespaceManager = new XmlNamespaceManager( xmlReader.NameTable ); // We now have a namespace manager that knows of the namespaces used in your document.
namespaceManager.AddNamespace( "prefix", "http://www.MyNamespace.ca/MyPath" ); // We add an explicit prefix mapping for our query.

var result = myXDocument.XPathSelectElement(
    "//prefix:Plugin/prefix:UI[1]/prefix:PluginPageCategory[1]/prefix:Page[1]/prefix:Group[1]/prefix:CommandRef[2]",
    namespaceManager
); // We use that prefix against the elements in the query.

Console.WriteLine(result); // <CommandRef ...> element is printed.

Hope this helps.

这篇关于XPathSelectElement始终返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆