Выберите дочерние узлы, но игнорируйте неэлементы с XPath? - PullRequest
1 голос
/ 18 мая 2011

Например, следующий 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-файлу и извлекать элементы, но не отдельный текст.


Как мы это исправили? Iпереключил все ссылки с child::node() на child::*.Тем не менее, я НЕ исправил одну строку в моем XAML, которая вытягивала child::node().Исправление этой строки заставило приложение вести себя корректно ... и заставило меня чувствовать себя глупо.

Ответы [ 4 ]

2 голосов
/ 18 мая 2011

это так же просто, как *.

(однако, оно получает непосредственные дочерние элементы; если вам нужны все элементы-потомки, это будет descendant::*)

2 голосов
/ 18 мая 2011

child::node() находит все дочерние узлы.child::* находит все элемент узлы.

1 голос
/ 18 мая 2011

child::* исключит текстовые узлы и оставит только узлы элементов

child::text() будет включать только текстовые узлы

child::node() будет включать как элемент, так и текстовые узлы

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

0 голосов
/ 18 мая 2011

Не уверен, что это то, что вы хотите, но можно ли это сделать таким образом?

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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...