xpath для получения позиции дочернего узла относительно родителя в XML - PullRequest
0 голосов
/ 15 апреля 2020

Мне нужно l oop через все chilnodes в родительском узле (callEvents) и сохранять каждый раз позицию дочернего узла (событие первого вызова, событие второго вызова ...). Я нахожусь в стеке, как получить позицию каждого дочернего узла в родительском узле java / xpath?

скажем, у меня есть следующее xml:

<callEvents>
          <gprsCall>...</gprsCall>
          <gprsCall>...</gprsCall>
          <mobileOrigintaedCall>...</mobileOrigintaedCall>
          <gprsCall>...</gprsCall>
          <gprsCall>...</gprsCall>
</callEvents> 

Таким образом, код должен return:

  • Моя первая позиция gprsCall = 1
  • Моя вторая позиция gprsCall = 2
  • Моя первая позиция mobileOriginatedCall = 3
  • Моя третья позиция gprsCall position = 4
  • Моя четвертая позиция gprsCall = 5

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathConstants;
import java.io.StringReader;
import org.xml.sax.InputSource;

class myxml {
    static final String xml = "<callEvents>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "<mobileOrigintaedCall>...</mobileOrigintaedCall>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "<gprsCall>...</gprsCall>\n"
        + "</callEvents>";

    public static void main (String... args) throws Throwable {
        try {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(new InputSource(new StringReader(xml)));

            XPathExpression xpath = XPathFactory.newInstance().newXPath().compile("/callEvents/*");
            NodeList nodelist = (NodeList) xpath.evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nodelist.getLength(); i++) {
                System.out.println("Position: " + (i + 1)
                                   + ", name: " + nodelist.item(i).getNodeName());
            }
        } catch (Throwable e) {
            throw e;
        }
    }
}
0 голосов
/ 15 апреля 2020

Выполните итерацию по XPath callEvents/* и используйте функцию position() для получения позиции.

Это пример XSLT:

<xsl:template match="/callEvents/*">
    <xsl:value-of select="concat(local-name(),' - ',position() div 2)" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...