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