#java #xml #xpath
#java #xml #xpath
Вопрос:
Есть ли способ извлечь из XML-файла все узлы, которые не являются пустыми, используя XPath? XML выглядит следующим образом:
<workspace>
<light>
<activeFlag>true</activeFlag>
<ambientLight>0.0:0.0:0.0:0.0</ambientLight>
<diffuseLight>1.0:1.0;1.0:1.0</diffuseLight>
<specularLight>2.0:2.0:2.0:2.0</specularLight>
<position>0.1:0.1:0.1:0.1</position>
<spotDirection>0.2:0.2:0.2:0.2</spotDirection>
<spotExponent>1.0</spotExponent>
<spotCutoff>2.0</spotCutoff>
<constantAttenuation>3.0</constantAttenuation>
<linearAtenuation>4.0</linearAtenuation>
<quadricAttenuation>5.0</quadricAttenuation>
</light>
<camera>
<activeFlag>true</activeFlag>
<position>2:2:2</position>
<normal>1:1:1</normal>
<direction>0:0:0</direction>
</camera>
<object>
<material>lemn</material>
<Lu>1</Lu>
<Lv>2</Lv>
<unit>metric</unit>
<tip>tip</tip>
<origin>1:1:1</origin>
<normal>2:2:2</normal>
<parent>
<object>null</object>
</parent>
<leafs>
<object>null</object>
</leafs>
</object>
После каждого тега анализатор «видит» другой пустой узел, который мне не нужен.
Комментарии:
1. Где находятся пустые узлы в предоставленном XML?
2. Он этого не «видит». Это действительно так. Это текстовый узел, и он содержит (в случае вашего документа, для большинства строк) символ возврата каретки, за которым следуют 4 пробела.
3. Между каждыми двумя тегами. Для каждой новой строки есть пустой узел.
4. Хороший вопрос, 1. Существует простое выражение для выбора нужных элементов. Вы знаете, что выбрали неправильный ответ?
Ответ №1:
Я предполагаю, что вам нужны все узлы элементов, которые имеют непосредственный дочерний текстовый узел, который не состоит исключительно из пробелов:
//*[string-length(normalize-space(text())) > 0]
Ответ №2:
Если вы используете XSLT, используйте <xsl:strip-space elements="*"/>
. Если вы этого не делаете, это зависит от того, какую технологию вы используете (вы нам не сказали), например. DOM, JDOM и т.д.
Ответ №3:
Вы хотите:
//*[normalize-space()]
Выражение:
//*[string-length(normalize-space(text())) > 0]
это неправильный ответ. Он выбирает все элементы в документе, текст дочернего элемента первого текстового узла которого не содержит только пробелов.
Следовательно, это не привело бы к выбору:
<p><b>Hello </b><i>World!</i></p>
хотя этот абзац содержит довольно много текста…