节点中元素的位置,java

时间:2018-09-16 19:26:28

标签: java xpath

假设我们在xml中有此节点:

<person>
   <name>Name</name>
   <lastName>LastName</lastName>
</person>

我想使用Java迭代到该节点,然后针对每个元素显示他在该节点中的位置。

在这种情况下,输出应为: 名称:位置0, 姓:位置1

谢谢!

2 个答案:

答案 0 :(得分:0)

您应该能够以某种集合或树模型获得所有节点。我已经习惯了Json,但是XML在这方面应该是相似的。您应该通过获取迭代器对象进行迭代并调用“ withIndex()”,然后调用forEach。您将获得类型为IndexedValue的对象,其中T是您要迭代的类型。或者,您可以使用内置的扩展功能“ forEachIndexed”中的Kotlins,它将为您提供两个参数:索引,值。

答案 1 :(得分:0)

您可以使用Java的XSLT获得所需的输出。为此,创建以下文件:

将输入文件命名为“ input.xml”:

<?xml version="1.0" encoding="UTF-8"?>
<person>
   <name>Name</name>
   <lastName>LastName</lastName>
</person>

创建一个transform.xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />

  <xsl:template match="/person">
    <xsl:for-each select="*">
        <xsl:value-of select="concat(name(),': position ',position()-1)" />
        <xsl:if test="position() != last()">, </xsl:if>        
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

并使用Java文件from this SO answer

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class TestMain {
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File("transform.xslt"));
        Transformer transformer = factory.newTransformer(xslt);

        Source text = new StreamSource(new File("input.xml"));
        transformer.transform(text, new StreamResult(new File("output.text")));
    }
}

然后执行Java代码(即这样):

javac TestMain.java
java  TestMain

现在output.text文件包含所需的文本。