синтаксический анализ java xpath

#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>
  

хотя этот абзац содержит довольно много текста…