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

本文关键字:XPath 元素 子节点 选择 | 更新日期: 2023-09-27 17:56:44

例如给定以下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(从根开始),该将选择除文本、注释和其他非元素之外的所有子节点。例如,使用此代码在 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 文件并拉取元素,但不能拉取单个文本。


我们如何解决这个问题?我已将child::node()的所有引用都切换到child::*。但是,我没有更正 XAML 中的一行,该行正在拉child::node()。更正此行使应用程序运行正确...让我觉得很傻。

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

child::node()查找所有子节点。 child::*查找所有元素节点。

就像

*一样简单。

(但是,这会得到直接子元素;如果你想要所有后代元素,那将是descendant::*

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

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

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

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

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

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);
        }