从 Marklogic 数据库中存在的 XML 个文档获取 XPath

Get XPath from XML Document Present in Marklogic Database

我是 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>

当我通过“Sequence_Number”时,它应该return /tXML/Header/Sequence_Number 并且可以多次使用“Sequence_Number”元素。

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

如果您传递 String "Sequence_Number" 那么它怎么知道要获取 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));
}

它在大文档上可能表现不佳,但您可以对元素名称使用字符串匹配来查找元素,然后使用 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!