Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从Wildfly解析standalone-full.xml_Python_Xml_Xpath_Xml Parsing - Fatal编程技术网

Python从Wildfly解析standalone-full.xml

Python从Wildfly解析standalone-full.xml,python,xml,xpath,xml-parsing,Python,Xml,Xpath,Xml Parsing,我试图用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"> <datasource

我试图用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>

jdbc:oracle:thin:@//HOST
ojdbc6
50
100
使用者
使用者
假的
真的
10000
org.h2.jdbcx.JdbcDataSource
oracle.ojdbc.xa.client.oraclexadasource

编辑:我怎样才能在树中更深入

我试过这样的方法:

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>]
[16]中的
:来自lxml导入etree
在[18]中:xml=etree.parse('standalone-full.xml')
在[21]中:root=xml.getroot()
在[28]中:children=root[0].getchildren()
在[31]中:子对象[0]
出[31]:
在[32]中:数据源=子项[0]
在[33]:datasources.getchildren()中
Out[33]:[]

我已经用regex解决了我的问题,这是一个坏主意,但它很管用

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)
重新导入
data=“standalone full.xml”
regex_result=re.findall(r'.*:domain:datasources[\S\S]*?pool name=“JNDI”[\S\S]*?连接url>*'+

'@/(.*)(.*)您可以使用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 augeas绑定用于python:

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")

您的问题相当不具体,但从您发布的正则表达式中我可以看到,您希望获取每个
数据源
节点下
连接url
用户名
密码
节点的文本值,这些节点具有
池名
属性,值为
JNDI
这样做的可能性(在Python 2.7下测试):


如果您无法解决问题,请检查并重新表述该问题。@WoodChopper:谢谢,没有看到该网站。有点帮助。重写该问题并修改代码。另一个CLI界面不是一个选项,因为该代码应作为Web服务运行。编辑:它可以与命名空间一起运行吗?因为我也会将代码用于其他设置。还有
key
字段可以是重复的。@JinnFox按照建议,使用Python绑定(我添加了一个示例,使用pypi中的Python augeas 0.5.0)。我不确定是否了解您关于名称空间的问题。
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