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.

Тарек

Другие вопросы по тегам