从Marklogic数据库中的XML Document获取XPath

时间:2018-03-22 17:50:01

标签: marklogic marklogic-8

我是Marklogic的新手,我的要求是,我在Marklogic数据库中包含多个元素的XML文档。

 ** Example :**    

<tXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Header>
        <Source>Source1</Source>
        <Action_Type>Action_Type1</Action_Type>
        <Sequence_Number>Sequence_Number1</Sequence_Number>
    </Header>
</tXML>

当我通过&#34; Sequence_Number &#34;它应该返回 / tXML / Header / Sequence_Number    并且可以有&#34; Sequence_Number &#34;元素多次。

请告诉我是否可以使用Marklogic XQuery / Java API,或者我需要使用任何第三方API来获得此结果。

2 个答案:

答案 0 :(得分:3)

它可能在大型文档上表现不佳,但您可以在元素名称上使用字符串匹配来查找元素,然后使用xdmp:path获取该文档的相应XPath。类似的东西:

xquery version "1.0-ml";

let $xml := document {
<tXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Header>
        <Source>Source1</Source>
        <Action_Type>Action_Type1</Action_Type>
        <Sequence_Number>Sequence_Number1</Sequence_Number>
    </Header>
</tXML>
}
let $elem-name := "Sequence_Number"
let $elems := $xml//*[local-name() eq $elem-name]
return $elems ! xdmp:path(.)

HTH!

答案 1 :(得分:0)

如果您通过了String&#34; Sequence_Number&#34;那怎么知道哪个Sequence_Number兄弟姐妹得到了XPath?你可能会谈论第一次出现,也可能是第二次或第三次,它不会知道。只给出一个tagName,它无法知道获取XPath的事件。

也就是说,下面的方法将为您提供元素所在位置的一般XPath。您只需要首先获取org.w3c.dom.Element,这可以从org.w3c.dom.Document获得。

public static String getXPathOfElement(org.w3c.dom.Element el) {
    Objects.requireNonNull(el);
    LinkedList<String> list = new LinkedList<>();
    for (Node n = el; n != null; n = n.getParentNode()) {
        if (n.getNodeType() == Node.ELEMENT_NODE)
            list.push(n.getNodeName());
        else
            list.push("");
    }
    return String.join("/", list);
}


public static void main(String[] args)
        throws ParserConfigurationException, SAXException, IOException {

    // Get an input stream of your Xml somehow
    String xml =
            "<tXML xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
            + "<Header>"
            + "<Source>Source1</Source>"
            + "<Action_Type>Action_Type1</Action_Type>"
            + "<Sequence_Number>Sequence_Number1</Sequence_Number>"
            + "</Header>"
            + "</tXML>";

    java.io.InputStream xmlInputStream = new java.io.ByteArrayInputStream(xml.getBytes());

    // Get the Document from the xml InputStream
    javax.xml.parsers.DocumentBuilderFactory docBuilderFact =
            javax.xml.parsers.DocumentBuilderFactory.newInstance();
    javax.xml.parsers.DocumentBuilder docBuilder = docBuilderFact.newDocumentBuilder();
    org.w3c.dom.Document doc = docBuilder.parse(xmlInputStream);

    // Get the Element you want the general XPath of
    // In this case just find the first one with a certain tag in the Document
    org.w3c.dom.Element el =
            (org.w3c.dom.Element) doc.getElementsByTagName("Sequence_Number").item(0);

    System.out.println(getXPathOfElement(el));
}