在bash中查询具有多个具有相同名称的元素的XML文档

时间:2014-09-07 02:04:26

标签: python xml bash xmlstarlet

我发现了几个与我有些相似的问题,但我无法调整他们的解决方案。

我有一个XML文档,其中有多个具有相同名称的元素。我无法提供确切的文档内容,但this question有一个等同的内容:

<table name="XFile">
    <row sourceLineNumber="D:\bla\bla\">
        <field>Borderish.fo</field>
        <field>Documents</field>
        <field>1</field>
        <field>This line here 1</field>
    </row>
    <row sourceLineNumber="D:\blah\blah\">
        <field>Charterish</field>
        <field>Documents</field>
        <field>1</field>
        <field>This line here 2</field>
    </row>
</table>

我需要能够执行与SQL语句SELECT field[3] WHERE field[0] = "Charterish"等效的操作。

如果有帮助,我的文档似乎确实有一个进一步定义的模式,它将每个<field>值映射到诸如“IP地址”之类的名称;我还没有找到有关如何使用此映射的任何信息,但我确信有一种方法。

到目前为止,我一直在尝试使用xmlstarlet进行解决;但是,如果更容易,我也可以选择使用python。请考虑我在bash / python中的级别有点基础,而我的XML级别非常基础。

1 个答案:

答案 0 :(得分:0)

假设您有一个包含此部分的XML文档(您应该是提供简化但仍然相关的XML的人):

<table name="XFile">
    <row sourceLineNumber="D:\bla\bla\">
        <field>Borderish.fo</field>
        <field>Documents</field>
        <field>1</field>
        <field>This line here 1</field>
    </row>
    <row sourceLineNumber="D:\blah\blah\">
        <field>Charterish</field>
        <field>Documents</field>
        <field>1</field>
        <field>This line here 2</field>
    </row>
</table>

并假设您的XML没有默认命名空间,那么您可以调整您链接的问题中提供的解决方案使用此XPath:

//row[field[1]='Charterish']/field[4]

上面的XPath是伪SQL查询的翻译:

SELECT field[3] WHERE field[0] = "Charterish"

请注意,XPath位置索引从1开始,而不是0