xPath Expression v1.0 [итератор, если есть] - PullRequest
0 голосов
/ 29 января 2020

Бит борется с l oop через Dynami c вхождение имен элементов и извлечение соответствующего значения Я пытаюсь использовать прямое выражение xPath.

Мой xml выглядит следующим образом:

<myXMLNode>
    <sunnyDay>YES</sunnyDay>
    <snowing>NO</snowing>   
    <temperatureInCelsius>
        <Date>2013-06-01</Date>
        <Date>2013-06-30</Date>
        <Date>2013-07-01</Date>
    </temperatureInCelsius>
</myXMLNode>

Я хочу извлечь все доступные значения элемента Date, разделив их по конвейеру, который постоянно меняется (в данный момент 3 даты в моем примере выше) пример вывода: 2013-06-01 | 2013-06-30 | 2013-07-01

Я пробовал ниже, но не повезло:

1. concat(//myXMLNode/temperatureInCelsius/Date[1], "_" ,//myXMLNode/temperatureInCelsius/Date[2], "_" ,//myXMLNode/temperatureInCelsius/Date[3])

2. //myXMLNode/temperatureInCelsius/Date[position()>0 or position()<=count(myXMLNode/temperatureInCelsius/Date)

3. //myXMLNode/temperatureInCelsius/Date[position()>0 and position()<=count(myXMLNode/temperatureInCelsius/Date)

Ответы [ 2 ]

1 голос
/ 29 января 2020

Правильное выражение XPath для извлечения всех соответствующих строк:

/myXMLNode/temperatureInCelsius/Date

или, возможно,

/myXMLNode/temperatureInCelsius/Date/text()

для непосредственного выбора текстовых узлов.

Объединение этих результатов с Разделитель, такой как |, должен выполняться не в XPath, а в используемом вами языке хоста или среде. Например, это просто сделать в Python:

>>> from lxml import etree
>>> document_string = """<myXMLNode>
...     <sunnyDay>YES</sunnyDay>
...     <snowing>NO</snowing>
...     <temperatureInCelsius>
...         <Date>2013-06-01</Date>
...         <Date>2013-06-30</Date>
...         <Date>2013-07-01</Date>
...     </temperatureInCelsius>
... </myXMLNode>"""
>>> root = etree.fromstring(document_string)
>>> dates = root.xpath("/myXMLNode/temperatureInCelsius/Date/text()")
>>> dates
['2013-06-01', '2013-06-30', '2013-07-01']
>>> "|".join(dates)
'2013-06-01|2013-06-30|2013-07-01'
0 голосов
/ 29 января 2020

В XPath 1.0 отсутствует манипулирование строковым значением последовательности или набора узлов (т. Е. string-join() из XPath 2.0+).

Итак, если вам не нужна фиксированная конкатенация, такая как concat(date[1],'|',date[2]), и вам удобно полагаться на XML конфигурацию сериализации / синтаксического анализа (в основном для отступов и сохранения только текстовых узлов с пробелами), вы можете использовать этот XPath выражение:

translate(normalize-space(/myXMLNode/temperatureInCelsius),' ','|')

Результат:

2013-06-01|2013-06-30|2013-07-01

Тест в здесь

...