




Учитывая образец документа:
<foo>
<bar>
<baz/>
<baz>Hello, world!</baz>
<baz><qux/></baz>
</bar>
</foo>
Это выражение сообщает вам, какие дочерние элементы foo/bar имеют дочерние элементы:
foo/bar/*[count(*)>0]
Это выражение сообщает вам, какие дочерние элементы foo/bar имеют дочерние текстовые узлы:
foo/bar/*[text()]
Поэтому, чтобы убедиться, что все дочерние элементы пусты (без дочерних элементов или текстовых узлов), убедитесь, что это выражение возвращает истину:
not(foo/bar/*[count(*)>0 or text()])
Ну, это зависит от того, что вы хотите исключить, но в целом да, вы можете. Не стесняйтесь редактировать свой вопрос, чтобы уточнить, что вы хотите исключить. :-)
Крис, вы вдохновили меня узнать больше о XPath. Благодаря Zvon.org и Google теперь я понимаю всю мощь XPath. Аминь!!!! Еще раз спасибо..
Без XPath вряд ли стоит использовать XML.
Этот запрос LINQ to XML должен приблизиться к тому, что вам нужно:
XElement xml = new XElement("contacts",
new XElement("contact",
new XAttribute("contactId", ""),
new XElement("firstName", ""),
new XElement("lastName", ""),
new XElement("Address",
new XElement("Street", ""))
),
new XElement("contact",
new XAttribute("contactId", ""),
new XElement("firstName", ""),
new XElement("lastName", "")
)
);
var query = from c in xml.Elements()
where c.Value != ""
select c;
Console.WriteLine(xml);
Console.WriteLine(query.Count());
Когда счетчик запроса == 0, у вас нет элементов с содержимым.
В зависимости от того, что вам нужно, и если у вас нет другого использования для манипуляции стилем LINQ, опубликованное решение xPath вполне может подойти лучше.
К сожалению, я все еще использую C# 2.0, поэтому не имею права использовать LINQ. Можно ли вам предложить что-нибудь еще?
Спасибо, Крис, это выглядит красиво и элегантно. Еще я могу исключить некоторые дочерние узлы как часть проверки. Например, есть некоторые узлы, которые я хочу игнорировать, независимо от того, заполнены они или нет.