我是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来获得此结果。
答案 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));
}