RegEx/XPath для соответствия определенным полям Adobe LiveCycle Designer в XML
Я использую следующий RegEx, чтобы соответствовать <field>
элементы в XML-виде формы Adobe LiveCycle Designer XFA.
Проверьте RegEx (?i)<(field)[\s\S]*?<\/\1>
и образец XML здесь: https://regex101.com/r/80gkRp/1
Вышеупомянутый RegEx работает нормально, и я мог бы играть с ним довольно хорошо. Однако я нахожу трудности с ограничением совпадений для определенных типов элементов.
Предположим, например, что я хочу сопоставить определенные элементы поля, которые имеют атрибут presence="hidden"
и должен иметь внутренний button
элемент и <bind>
элемент с атрибутом match
должен равняться none
(т.е. bind match='none'
должен присутствовать), следующим образом:
<field bla bla bla name="First_Name" presence="hidden" bla bla bla>
... bla bla
<ui>
<button bla bla bla/>
</ui>
...
<bind match="none"/>
...
</field>``
Пожалуйста, дайте мне решение как можно ближе, и нет необходимости удовлетворять вышеуказанным сложным критериям при аренде, чтобы иметь возможность соответствовать полю, которое является кнопкой.
Тарек
2 ответа
Regex - определенно не лучший вариант для запроса XML. Мое предложение состоит в том, чтобы использовать какие-то инструменты / структуры / механизмы, связанные с XML. XPath является одним из них. В вашем случае запрос XPath получить field
элементы с соответствующими элементами-потомками будут:
//field[@presence = "hidden" and .//button and .//bind[@match = "none"]]
Благодаря Кириллу Полищуку он привел меня к ответу.
Цель этого - получить список имен полей, которые можно заполнить, чтобы мы могли зарегистрировать их в базе данных. Для этого нам нужно сгенерировать операторы INSERT SQL. У нас уже есть шаблон Excel для этой цели, и нам нужны только имена полей.
Поэтому я использовал https://codebeautify.org/Xpath-Tester и приведенное ниже выражение XPath, чтобы получить список имен полей:
(/subform/field[not(.//button)]|/subform/exclGroup)/@name
Затем я могу просто проанализировать вывод в Notepad++, чтобы получить только имя, по одному полю в каждой строке.
Это в 100 раз проще, чем с помощью RegEx.
Тарек