首页 文章

选择子节点,但忽略XPath的非元素?

提问于
浏览
1

给出以下XML文档,例如:

<?xml version="1.0"?>
<UrdaObject>
  <Date>
    <Year>2011</Year>
    <Month>5</Month>
    <Day>18</Day>
    <Hours>8</Hours>
    <Minutes>47</Minutes>
    <Seconds>36</Seconds>
  </Date>
  <random_value>24</random_value>
</UrdaObject>

并理解 child::node() - Selects all child nodes of the current node 如何创建一个 XPath (从根开始),它将选择所有子节点,除了文本,注释和其他 things that are NOT elements . 例如,使用此代码在WPF中创建树视图时:

// x is some XmlDocument, xmlTree is my WPF TreeView
XmlDataProvider provider = new XmlDataProvider();
provider.Document = x;
Binding binding = new Binding();
binding.Source = provider;
binding.XPath = "child::node()";
xmlTree.SetBinding(TreeView.ItemsSourceProperty, binding);

我将如何创建我的XPath语句,以便构建一个树视图,其中节点一直向下并在原始文本之前停止?例如,它会生成以下视图:

UrdaObject
  Date
    Year
...

代替...

UrdaObject
  Date
    Year
      2011 (Don't want this!)
...

示例XML文件仅供我解释我的情况 . 表达式应该能够导航任何有效的XML文件并提取元素,而不是单个文本 .


How did we fix this? 我已将 child::node() 的所有引用切换为 child::* . 但是,我没有更正我的XAML中的一行,这是拉 child::node() . 纠正这一行使应用程序正常运行......让我感到愚蠢 .

4 回答

  • 0

    child::node() 找到所有子节点 . child::* 找到所有元素节点 .

  • 2

    它就像 * 一样简单 .

    (然而,这会得到直接的孩子;如果你想要所有的后代元素,它将是 descendant::*

  • 2

    child::* 将排除文本节点并仅保留元素节点

    child::text() 将仅包含文本节点

    child::node() 将包括元素和文本节点

    http://www.w3.org/TR/xpath/#location-paths

  • 1

    不确定这是否是您想要的但是可以这样做吗?

    var doc =XDocument.Parse(@"
    
    <UrdaObject>
      <Date>
        <Year>2011</Year>
        <Month>5</Month>
        <Day>18</Day>
        <Hours>8</Hours>
        <Minutes>47</Minutes>
        <Seconds>36</Seconds>
      </Date>
      <random_value>24</random_value>
    </UrdaObject>
    ");
    
    
    
            var query = from s in doc.Descendants()
                        select s.Name;
    
    
            foreach (var name in query)
            {
                Console.WriteLine(name);
            }
    

相关问题