LINUX.ORG.RU

Как в XPath выбрать элементы с частично известным именем?

 ,


0

1

Имеется следующий XML-код, сгенерированный некой программой с закрытыми исходниками:

<?xml version="1.0" encoding="utf-8"?>
<preparedreport>
    <b1 t="0">
        <m1 u="Период: 01.01.2024..08.08.2024"/>
    </b1>
    <b7 t="80.25201">
        <m53 u="Таблица"/>
    </b7>
    <b5 t="178.92919">
        <m33 u="09.01.2024"/>
        <m38 u="1"/>
        <m40 u="00:06"/>
    </b5>
    <b5 t="196.92919">
        <m33 u="10.01.2024"/>
        <m38 u="1"/>
        <m40 u="00:22"/>
    </b5>
</preparedreport>

Необходимо через XPath выбрать значения атрибута u для всех элементов, имя которых начинается на m.

То есть, в данном случае для элементов m1, m53, m33, m38, m40. А циферки в реальном XML-документе могут быть непредсказуемы, то бишь совершенно разные.

Вопрос: как через XPath выбирать элементы, имя которых начинается на m?

И вопрос со звездочкой: как через XPath выбрать элементы, имя которых начинается на m, после чего в имени идут только цифры?

Подозреваю, что правильный ответ - никак. Но хотелось бы подтверждения от реально знающих предмет специалистов.



Перемещено hobbit из general

★★★★★

Ага, похоже что решение есть только для XPath 2.0.

А для XPath 1.0 можно начало имени писать так:

//*[starts-with(name(), 'chunk')]

Но в XPath 1.0 при такой записи невозможно проверить что после имени идут цифры.

Xintrea ★★★★★
() автор топика

Сразу предупрежу, что мой комментарий не поможет тебе решить проблему, но вообще тем, кто писал генератор такого «XML», можно послать только лучи поноса. Для него, скорее всего даже XML Schema описать не получится (если только предположить, что число после m находится в конечном диапазоне, скажем, 1..64, и все 64 элемента описать раздельно). Я, скорее, удивлён, что для XPath 2.0 решение нашлось.

В грамотно составленном XML число после m сделали бы атрибутом.

(Впрочем, если некая программа с закрытыми исходниками – это заказное ПО, на которое потратился конкретно твой заказчик/работодатель, можно попробовать ему изящно намекнуть, что в прошлый раз он таким образом потратил деньги на неквалифицированных подрядчиков и таким образом чуток набить цену своей работе. Если же это что-то серийное, то наверное, пользы от моего комментария никакой…)

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ты случаем не один из тех сибирских мужиков из анекдота про японскую бензопилу? Логика прямо 1:1.

Любой инструмент требует грамотного подхода и XML – не исключение.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

//m[starts-with(name(), 'm') and not(contains(u, '.'))]/@u

Chatgpt говорит что так, но кодовый пример не работает. Смотреть не стал в чем ошибка, скорее всего что надо еще разбивать :

anonymous_sama ★★★★★
()