0

如何浏览和列出 XML 消息的 XPATH?

****见下面的编辑部分:

感谢您调查此问题。我不确定,这是否是发布此主题的正确论坛。如果没有,请告诉我发布此主题的正确论坛。

我们有一个复杂的 XML 消息(XML 格式的数据)。我们正在探索一种方法来提取此 XML 消息的所有 XPATH 及其元素/属性级别的数据内容。我们尝试使用 XMLSPY 和 xmltwig,但没有运气。如果我们提供 XPATH 输入,Xml_grep 会提取数据。xml_grep 中没有选项可以浏览 XML 消息的所有 XPATH。

我有格式正确的 XML 消息。我想生成一个列表/报告为

  1. XML 消息的所有 Xpath (浏览所有 XPATH 和 XML 消息列表)

  2. Xpath ,此 XPATH 的数据内容(浏览所有 XPATH,数据内容并列出 XML 消息)

这是一个示例(输入 XML 消息)

<?xml version="1.0"?>
<PARTS>
<TITLE>Computer Parts</TITLE>
<PART>
<ITEM>Motherboard</ITEM>
<MANUFACTURER>ASUS</MANUFACTURER>
<MODEL>P3B-F</MODEL>
<COST> 123.00</COST>
</PART>
<PART>
<ITEM>Video Card</ITEM>
<MANUFACTURER>ATI</MANUFACTURER>
<MODEL>All-in-Wonder Pro</MODEL>
<COST> 160.00</COST>
</PART>
<PART>
<ITEM>Sound Card</ITEM>
<MANUFACTURER>Creative Labs</MANUFACTURER>
<MODEL>Sound Blaster Live</MODEL>
<COST> 80.00</COST>
</PART>
<PART>
<ITEM>inch Monitor</ITEM>
<MANUFACTURER>LG Electronics</MANUFACTURER>
<MODEL> 995E</MODEL>
<COST> 290.00</COST>
</PART>
</PARTS>

所需的输出 --> 我手动创建了以下 XML 列表

/PARTS/TITLE Computer       Parts
/PARTS/PART[1]/ITEM         Motherboard
/PARTS/PART[1]/MANUFACTURER ASUS
/PARTS/PART[1]/MODEL        P3B-F
/PARTS/PART[1]/COST         123.00
/PARTS/PART[2]/ITEM         Video Card
/PARTS/PART[2]/MANUFACTURER ATI
............
..............
..................
...................

是否有任何开源产品可以为 XML 消息生成此类报告?

提取 XPATHs/XPATH、数据内容的方法有哪些?

感谢您允许选择这个论坛的大脑。

+++++

谢谢。上面的代码输出

Field|Value
/*|

/*/*[1]|X
/*/*[2]|000000000
/*/*[3]|000000000
/*/*[4]|&
/*/*[5]|

我无法获取文本 xpath

这是输入的xml

<CorrectedW2Ind>X</CorrectedW2Ind>
<EmployeeSSN>000000000</EmployeeSSN>
<EmployerEIN>000000000</EmployerEIN>
<EmployerNameControlTxt>&amp;</EmployerNameControlTxt>
<EmployerName>
    <BusinessNameLine1Txt>#</BusinessNameLine1Txt>
    <BusinessNameLine2Txt>#</BusinessNameLine2Txt>
</EmployerName>
<EmployerUSAddress>
    <AddressLine1Txt>0</AddressLine1Txt>
    <AddressLine2Txt>0</AddressLine2Txt>
    <CityNm>A</CityNm>
    <StateAbbreviationCd>PW</StateAbbreviationCd>
    <ZIPCd>00000</ZIPCd>
</EmployerUSAddress>

    <EmployersUseGrp>
    <EmployersUseCd>A</EmployersUseCd>
    <PriorUSERRAContributionYr>00</PriorUSERRAContributionYr>
    <EmployersUseAmt>0</EmployersUseAmt>
</EmployersUseGrp>
<EmployersUseGrp>
    <EmployersUseCd>A</EmployersUseCd>
    <PriorUSERRAContributionYr>00</PriorUSERRAContributionYr>
    <EmployersUseAmt>0</EmployersUseAmt>
</EmployersUseGrp>
<EmployersUseGrp>
    <EmployersUseCd>A</EmployersUseCd>
    <PriorUSERRAContributionYr>00</PriorUSERRAContributionYr>
    <EmployersUseAmt>0</EmployersUseAmt>
</EmployersUseGrp>
<EmployersUseGrp>
    <EmployersUseCd>A</EmployersUseCd>
    <PriorUSERRAContributionYr>00</PriorUSERRAContributionYr>
    <EmployersUseAmt>0</EmployersUseAmt>
</EmployersUseGrp>
<EmployersUseGrp>
    <EmployersUseCd>A</EmployersUseCd>
    <PriorUSERRAContributionYr>00</PriorUSERRAContributionYr>
    <EmployersUseAmt>0</EmployersUseAmt>
</EmployersUseGrp>

a) 使用上述代码获取值、Xpath(文本)的 lxml 方法是什么?

b) 使用什么 lxml 方法来获得重复的组节点聚合?

像 EmployersUseGrp 的 Xpath ====> 5

编辑 ===== 6/26/2019 =========================

我无法提出新问题。我收到超出问题限制的消息。我在此处发布此代码的后续内容。

我正在尝试使用发布的 pyhton 代码答案。我得到奇怪的输出。

我有一个大的 XML 文件,例如 (inputf.xml)。我在发布的代码中将此文件用作 input = inputf.xml




    <?xml version="1.0" encoding="UTF-8"?>
      <DataFileFor>
        <DataR>
           <Id>5070022019330a0050hq</Id>
             <NUM>30221730001019</NUM>
             <Postmark>2020-01-03T09:25:57.000-05:00</Postmark>
             <TNO>47647</TNO>
.
.
.
.
.
</DataFileFor>

++++

当使用 xml_grep 获取节点的 XPATH 时,我得到了。

xml_grep DataFileFor/DataR/Ret/W2 inputf.xml ===> 输出


<?xml version="1.0" ?>

<xml_grep version="0.7" date="Fri Jun 26 13:07:11 2020">

<file filename="inputf.xml">

  <W2 Id="W2" dName="W2" sId="00000000" sVersionNum="String">

    <CorrectedW2Ind>X</CorrectedW2Ind>

    <EmployeeSSN>000000000</EmployeeSSN>

    <EmployerEIN>000000000</EmployerEIN>

    <EmployerNameControlTxt>S</EmployerNameControlTxt>

    <EmployerName>

      <BusinessNameLine1Txt>String</BusinessNameLine1Txt>

      <BusinessNameLine2Txt>String</BusinessNameLine2Txt>

    </EmployerName>

    <EmployerUSAddress>

      <AddressLine1Txt>String</AddressLine1Txt>

      <AddressLine2Txt>String</AddressLine2Txt>

      <CityNm>String</CityNm>

      <StateAbbreviationCd>AL</StateAbbreviationCd>

      <ZIPCd>000000000</ZIPCd>
.
.
.
.
.
</W2>

当我使用此代码时,它不会生成可读的 Xpath。输出 XPATHS 就像


/DataFileFor/DataR/*[8]/*[2]/*[6]/*[3]/*[10]|X
/DataFileFor/DataR/*[8]/*[2]/*[6]/*[3]/*[11]|00000000
/DataFileFor/DataR/*[8]/*[2]/*[6]/*[3]/*[12]|00000000
/DataFileFor/DataR/*[8]/*[2]/*[6]/*[3]/*[13]|S
/DataFileFor/DataR/*[8]/*[2]/*[6]/*[3]/*[14]|String

属性

Id="W2" dName="W2" sId="00000000" sVersionNum="String"> 未显示在输出中

需要对代码进行哪些更改才能解决此问题?

感谢您的指导。

4

1 回答 1

1

刚刚看到这个,我在python中写了一些东西 - 输出到csv,管道分隔。随意使用它。乐于回答任何问题,但不要指望立即回复。

from lxml import etree, objectify

def parseXML(xmlFile, outputFile):
    """
    Parse the XML function
    """
    with open(xmlFile) as fobj:
        xml = fobj.read()

    f = open(outputFile,'w') #open write to file
    root = etree.fromstring(xml)

    f.write("%s|%s\n" %("Field", "Value"))
    tree = etree.ElementTree(root)
    for e in root.iter():
        f.write("%s|%s\n" %(tree.getpath(e), e.text))

    f.close()

if __name__ == "__main__":
    print ('Loading variables...')
    input = '16a.xml'
    output = input + '.csv'

    parseXML(input,output)
于 2019-11-27T17:23:01.963 回答