将所有xml节点的特定属性值导出到另一个文件

时间:2015-11-01 23:57:46

标签: xml xpath xmlstarlet xmllint

我有一个XML文档,其结构如下:

<root>
    <parent id="idvalue1" attr1="val1" attr2="val2" ...>
        <child attr3="val3" attr4="val4" ... />
        <child attr3="val5" attr4="val6" ... />
        ...
    </parent>
    <parent id="idvalue2" attr1="val7" attr2="val8" ... />
    ...
</root>

我想获得拥有它的所有节点的id属性的所有值的列表。现在可以安全地假设只有第二级元素具有id属性。

无论如何,这样做的最佳方式是什么?它是xmllintxpath还是xmlstarlet

2 个答案:

答案 0 :(得分:1)

  

我想获得所有拥有它的节点的id属性的所有值的列表。

使用XPath,您可以使用如下表达式:

 <html land="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <script>
            function loadXMLDoc(XML65) {
                xhttp = new XMLHttpRequest();
                xhttp.open("GET", XML65, false);
                xhttp.send();
                return xhttp.responseXML;
            }
        </script>
    </head>
    <body>
        <h1>Testing XML FILE</h1>
        <script>
            var xmlDoc = loadXMLDoc("XML65.xml");

            for (i = 0; i < xmlDoc.childNodes.length; i++)
            {
                thisNode = xmlDoc.childNodes[i];
                document.write("The root element has this many direct children: " + i);

            }
        </script>

    </body>
    </html>

我觉得很容易。如果你想要一些布局,你可以使用XSLT:

//@id

将为您提供名称为<xsl:template match="/"> <xsl:apply-templates select="//@*" /> </xsl:template> <xsl:template match="@id"> <xsl:text>Id is: </xsl:text> <xsl:value-of select="." /> <xsl:text>&#xA;</xsl:text> </xsl:text> 的所有属性的换行符分隔列表。

答案 1 :(得分:1)

您可以使用xmlstarlet输出列表:

    xmlstarlet sel -t -v "//@id" yourfile.xml

但是,这只会输出ID值。

-t选项“创建”类似于Abel的答案中建议的XSLT。但输出只是您使用sel命令选择的输出。选项-v是用引号打印xpath的值。 xpath表达式中的双斜杠调用所有节点。