Документация к пакету для javax.xml.xpath
дает хорошее введение, но вот также пример кода:
InputSource xml = new InputSource(new StringReader("<a>\n" +
"<b>\n" +
"<c id=\"00001\" time=\"1:00\" day=\"Friday\" name1=\"John\" name2=\"Mary\"></c>\n" +
"<c id=\"00002\" time=\"2:00\" day=\"Monday\" name1=\"Ed\" name2=\"Kate\"></c>\n" +
"<c id=\"00003\" time=\"3:00\" day=\"Sunday\" name1=\"Mary\" name2=\"Ed\"></c>\n" +
"<c id=\"00004\" time=\"4:00\" day=\"Friday\" name1=\"Kate\" name2=\"John\"></c>\n" +
"</b>\n" +
"</a>"));
Так что нет SAX, но подойдет любой DOM InputSource
. После этого это:
String name = "John";
XPath xpath = XPathFactory.newInstance().newXPath();
// the String.format is just here so you can see the XPath expression more
// clearly without all the ".."+x+".." string concat, feel free to replace
String expr = String.format("//a/b/c[@name1='%s']", name);
Node c = (Node) xpath.evaluate(expr, xml, XPathConstants.NODE);
NamedNodeMap attribs = c.getAttributes();
String id = attribs.getNamedItem("id").getNodeValue();
String time = attribs.getNamedItem("time").getNodeValue();
// etc.
Если имя элемента c
уникально во всем документе, вы можете сократить выражение XPath до //c[@name1='%s']
.
Если вам необходимо сопоставить оба значения name1
и name2
, используйте вместо этого этот тест узла: [@name1='%s' or @name2='%s']
. В этом случае вам, вероятно, также потребуется получить NodeList
из evaluate()
для обработки нескольких совпадений:
NodeList c = (NodeList) xpath.evaluate(expr, xml, XPathConstants.NODESET);