Синтаксический анализ XML с помощью пространства имен с использованием Ansible, в частности JBOSS standalone.xml - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь изменить значения в файле конфигурации standalone-full.xml для сервера JBoss.Проблема, с которой я сталкиваюсь, связана с пространством имен.Я сделал несколько поисков и попробовал несколько различных сценариев, которые я предоставлю.Я знаю, что это как-то связано с пространством имен, потому что когда я удаляю его, playbook работает.Я предполагаю, что я упускаю что-то простое и буду очень признателен за любую помощь, которая может быть оказана.Я довольно слабо разбираюсь в xpath, что, вероятно, является большой частью проблемы.

Ниже приведен пример кода и различные попытки заставить это работать.

sample.xml:

<?xml version='1.0' encoding='UTF-8'?>
<server xmlns="urn:jboss:domain:1.7">
<extensions>
    <!-- <extension module="org.jboss.as.clustering.infinispan"/>-->
    <extension module="org.jboss.as.cmp"/>
    <extension module="org.jboss.as.connector"/>
    <extension module="org.jboss.as.deployment-scanner"/>
    <extension module="org.jboss.as.ee"/>
    <extension module="org.jboss.as.ejb3"/>
    <extension module="org.jboss.as.jacorb"/>
    <extension module="org.jboss.as.jaxr"/>
    <extension module="org.jboss.as.jaxrs"/>
    <extension module="org.jboss.as.jdr"/>
    <extension module="org.jboss.as.jmx"/>
    <extension module="org.jboss.as.jpa"/>
    <extension module="org.jboss.as.jsf"/>
    <extension module="org.jboss.as.jsr77"/>
    <extension module="org.jboss.as.logging"/>
    <extension module="org.jboss.as.mail"/>
    <extension module="org.jboss.as.messaging"/>
    <extension module="org.jboss.as.naming"/>
    <extension module="org.jboss.as.pojo"/>
    <extension module="org.jboss.as.remoting"/>
    <extension module="org.jboss.as.sar"/>
    <extension module="org.jboss.as.security"/>
    <extension module="org.jboss.as.threads"/>
    <extension module="org.jboss.as.transactions"/>
    <extension module="org.jboss.as.web"/>
    <extension module="org.jboss.as.webservices"/>
    <extension module="org.jboss.as.weld"/>
</extensions>
<system-properties>
    <property name="app.datasource.connection-url" value="jdbc:oracle:thin:@(description=(address=(protocol=tcp)(host=mdatabase.example.com)(port=1521))(connect_data=(service_name=myservice)))"/>
    <property name="app.datasource.security.user-name" value="Myuser"/>
    <property name="app.datasource.security.password" value="mypassword"/>
</system-properties>
</server>

simpleplay.xml:

---
- hosts: all
  gather_facts: no
  connection: local
  tasks:
    - name: "Read XML"
      xml:
        path: sample.xml
        xpath: /server/system-properties/property[@name='app.datasource.security.user-name']
        attribute: value
        content: attribute
     register: my_val


- name: "Show me"
  debug:
    var: my_val

без хостов:

localhost
  1. Первая попытка: (которая подтвердила мне, что пространство имен было моей проблемой.) В файле sample.xml я изменил:

    <server xmlns="urn:jboss:domain:1.7">
    

    на

    <server>
    

напроизводить:

    PLAY [all] *******************************************************************************************************************************************************************************************************

    TASK [Read XML] **************************************************************************************************************************************************************************************************
    ok: [localhost]

    TASK [Show me] ***************************************************************************************************************************************************************************************************
    ok: [localhost] => {
        "my_val": {
        "actions": {
            "namespaces": {},
            "state": "present",
            "xpath": "/server/system-properties/property[@name='app.datasource.security.user-name']"
        },
        "changed": false,
        "count": 1,
        "failed": false,
        "matches": [
            {
                "property": {
                    "name": "app.datasource.security.user-name",
                    "value": "Myuser"
                }
            } 
        ],
        "msg": 1
        }
    }

    PLAY RECAP *******************************************************************************************************************************************************************************************************
    localhost                  : ok=2    changed=0    unreachable=0    failed=0

Добавлено пространство имен для xml в игре с пространством имен, добавленным обратно в sample.xml:

---
- hosts: all
  gather_facts: no
  connection: local
  tasks:
    - name: "Read XML"
      xml:
        path: sample.xml
        xpath: /x:server/system-properties/property[@name='app.datasource.security.user-name']
        namespaces:
          x: "urn:jboss:domain:1.7"
        attribute: value
        content: attribute
     register: my_val

, что дает:

PLAY [all] *******************************************************************************************************************************************************************************************************

TASK [Read XML] **************************************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Xpath /x:server/system-properties/property[@name='app.datasource.security.user-name'] does not reference a node!"}
to retry, use: --limit @/home/ec2-user/work/xpathtest/simpleplay.retry

PLAY RECAP *******************************************************************************************************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1

Несколькоxpaths, которые я пробовал:

  • / x: сервер / x: свойства системы / x: свойство [@x: name = 'app.datasource.security.user-name']

  • / server [namespace-uri () = 'urn: jboss: домен: 1.7'] / system-properties / property [@ name = 'app.datasource.security.user-имя ']

  • / * [local-name () = server] / system-properties / property [@ name =' app.datasource.security.user-name ']

Все также дают вышеуказанный результат.

Боюсь, я недостаточно хорошо понимаю пространство имен, чтобы понять, что я делаю неправильно.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 14 февраля 2019

Проблема связана с пространствами имен.Все элементы привязаны к пространству имен urn:jboss:domain:1.7.Это немного сложно понять, так как префикса пространства имен нет.Все элементы привязаны к этому пространству имен, но если для атрибута не используется префикс пространства имен, он не будет.

Итак, ваш XPath: /x:server/x:system-properties/x:property[@x:name='app.datasource.security.user-name'] должен быть:

/x:server/x:system-properties/x:property[@name='app.datasource.security.user-name']

Для XPath: /server[namespace-uri()='urn:jboss:domain:1.7']/system-properties/property[@name='app.datasource.security.user-name'] вам потребуется общее соответствие для любого элемента *, а затем использовать предикат для ограничения local-name(), а также можно использовать namespace-uri() в качестве критерия:

/*[local-name() = 'server' and namespace-uri() = 'urn:jboss:domain:1.7']/*[local-name() = 'system-properties']/*[local-name() = 'property' and @name='app.datasource.security.user-name']

Для XPath /*[local-name()=server]/system-properties/property[@name='app.datasource.security.user-name'] у вас не было server в кавычках.Он пытался сравнить local-name() с дочерним элементом server, который не существует.Точно так же вам нужно будет использовать предикат для соответствия local-name() для потомков:

/*[local-name()='server']/*[local-name() = 'system-properties']/*[local-name() = 'property' and @name='app.datasource.security.user-name']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...