2017-06-17 50 views
0

我有这个XML,我试图从中提取序列号。可能找到具有特定名称的元素的实例,不管其位置如何

但是,序列号不在同一级别,所以我觉得很难完成它,因为我使用的工具要求我使用一个XPATH表达式来完成它。

<rpc-reply> 
    <chassis-inventory> 
     <chassis junos:style="inventory"> 
      <name>Chassis</name> 
      <serial-number>AAABBB</serial-number> 
      <description>SRX220H</description> 
      <chassis-module> 
       <name>Routing Engine</name> 
       <version>REV 23</version> 
       <part-number>750-031175</part-number> 
       <serial-number>XXXYYY</serial-number> 
       <description>RE-SRX220H</description> 
      </chassis-module> 
      <chassis-module> 
       <name>FPC 0</name> 
       <description>FPC</description> 
       <chassis-sub-module> 
        <name>PIC 0</name> 
        <description>8x GE Base PIC</description> 
       </chassis-sub-module> 
      </chassis-module> 
      <chassis-module> 
       <name>Power Supply 0</name> 
      </chassis-module> 
     </chassis> 
    </chassis-inventory> 
    <cli> 
     <banner></banner> 
    </cli> 
</rpc-reply> 

我希望提取的数据是:

<name>Chassis</name> 
<serial-number>AAABBB</serial-number> 

<name>Routing Engine</name> 
<serial-number>XXXYYY</serial-number> 

任何想法?

亲切的问候,

帕特里克

+0

显示您的尝试和当前输出。另外指定你的工具使用的XPath版本 – Andersson

+0

嗨,谢谢你的评论!我没有太多的展示,因为我找不到任何“位置独立”的方式来查找数据。我的想法是检索所有具有* name *和* serial-number *的“关卡”并显示它们。该工具是专有的第三方,所以我实际上不知道它是哪个版本。 – PatrikJ

+0

您尚未说明根据XML选择这些元素的基础。在你这样做之前,你所得到的只是猜测,一般而言可能对你不起作用。 – kjhughes

回答

1

尝试使用下面XPath表达来获得所需的输出:

//chassis-module[1]//preceding::*[name()=("name", "serial-number")] 
+0

我通常会尝试https://codebeautify.org/Xpath-Tester来测试XPath,至少在那里没有用。将研究先前的情况。谢谢! – PatrikJ

+0

此XPath需要XPath 2.0。另外,OP还没有说明要选择的元素的标准,所以这个问题目前还不太明确。 – kjhughes

+0

我有点以上,但以通俗的说法。 – PatrikJ

0

我们结束了 “解决” 是这样的。不知道这是纯粹的XPath或不是,但它的工作:

/rpc-reply//chassis | /rpc-reply//chassis-module 

感谢所有破译我写得不好的XPath问题的企图!

/Patrik

+1

你的表达式的输出甚至不接近要求索赔的输出:)) – Andersson

+0

哈哈,同意!但考虑到我们缺乏经验,我们只能为我们合作的第一件事情而努力。 :)问题仍然没有答案。 – PatrikJ

相关问题