【问题标题】:Python parse standalone-full.xml from WildflyPython 从 Wildfly 解析standalone-full.xml
【发布时间】:2015-10-05 12:26:45
【问题描述】:

我正在尝试使用 python 解析 Wildfly 8.1 Final 中的standalone-full.xml,以提取一些信息作为数据源。

下面的示例 XML。

<?xml version="1.0" ?>
<server xmlns="urn:jboss:domain:2.1">
<profile>
       <subsystem xmlns="urn:jboss:domain:datasources:2.0">
        <datasources>
            <datasource jndi-name="java:jboss/datasources/JNDI" pool-name="JNDI" enabled="true">
                <connection-url>jdbc:oracle:thin:@//HOST</connection-url>
                <driver>ojdbc6</driver>
                <pool>
                    <min-pool-size>50</min-pool-size>
                    <max-pool-size>100</max-pool-size>
                </pool>
                <security>
                    <user-name>USER</user-name>
                    <password>USER</password>
                </security>
                <validation>
                    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>true</background-validation>
                    <background-validation-millis>10000</background-validation-millis>
                    <exception-sorter class-name="org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter"/>
                </validation>
            </datasource>
            <drivers>
                <driver name="h2" module="com.h2database.h2">
                    <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                </driver>
                <driver name="ojdbc6" module="oracle.ojdbc">
                    <xa-datasource-class>oracle.ojdbc.xa.client.OracleXADataSource</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>
    </subsystem>
 </profile>

编辑:我怎样才能更深入地了解树?

我尝试过这样的事情:

In[16]: from lxml import etree
In[18]: xml = etree.parse('standalone-full.xml')
In[21]: root = xml.getroot()
In[28]: children = root[0].getchildren()
In[31]: children[0]
Out[31]: <Element {urn:jboss:domain:datasources:2.0}subsystem at 0x4bef208>
In[32]: datasources = children[0]
In[33]: datasources.getchildren()
Out[33]: [<Element {urn:jboss:domain:datasources:2.0}datasources at 0x4befa48>]

【问题讨论】:

  • 查看tutorial,如果无法解决,请重新表述问题。
  • @WoodChopper:谢谢,没看到那个网站。有点帮助。重写了问题并修改了代码。

标签: python xml xpath xml-parsing


【解决方案1】:

您的问题相当不具体,但据我从您发布的正则表达式中可以看出,您希望在每个 datasource 节点下获取 connection-urluser-namepassword 节点的文本值有一个pool-name 属性,其值为JNDI。这是这样做的一种可能性(在 Python 2.7 下测试):

import xml.etree.cElementTree as ET

ns = {'ds': 'urn:jboss:domain:datasources:2.0'}
root = ET.parse('standalone-full.xml').getroot()
children = root.findall(".//ds:datasource[@pool-name='JNDI']", ns)

for child in children:
    print child.find("ds:connection-url", ns).text
    security = child.find("ds:security", ns)
    print security.find("ds:user-name", ns).text
    print security.find("ds:password", ns).text

【讨论】:

    【解决方案2】:

    你可以使用 Augeas 来解析它:

    $ augtool -At "Xml.lns incl $PWD/standalone-full.xml"
    augtool> get //standalone-full.xml//datasource//password/#text
    //standalone-full.xml//datasource//password/#text = USER
    

    只需在 Python 中使用 python-augeas 绑定:

    import augeas
    a = augeas.Augeas(flags=augeas.Augeas.NO_MODL_AUTOLOAD)
    a.transform("Xml", "/home/raphink/bas/augeas/standalone-full.xml")
    a.load()
    v = a.get("//standalone-full.xml//datasource//password/#text")
    

    【讨论】:

    • 另一个 CLI 接口不是一个选项,因为此代码应作为 Web 服务运行。编辑:它可以使用命名空间运行吗?因为我也会将代码重用于其他设置。 key 字段可以重复。
    • @JinnFox 正如建议的那样,使用 Python 绑定(我添加了一个示例,使用来自 pypi 的 python-augeas 0.5.0)。我不确定你关于命名空间的问题。
    【解决方案3】:

    我已经用正则表达式解决了我的问题,这是一个坏主意,但它确实有效。

    import re
    data = "standalone-full.xml"
    regex_result = re.findall(r'.*:domain:datasources[\S\s]*?pool-name="JNDI"[\S\s]*?connection-url>.*' +
                                          '@//(.*)<.*[\S\s]*?user-name>(.*)<.*\s*<password>(.*)<', data, re.M)
    

    【讨论】:

      猜你喜欢
      • 2014-11-09
      • 2015-08-23
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2017-12-18
      • 2015-12-27
      • 1970-01-01
      相关资源
      最近更新 更多