所以,我有一个看起来像这样的XML结构。
<root xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
<actors>
<actorUID>1w2e3r</actorUID>
<actor id="1">
<name>Christian Bale</name>
<age>40</age>
</actor>
<actor id="2">
<name>LiamNeeson</name>
<age>45</age>
</actor>
<actor id="3">
<name>Michael</name>
<age>60</age>
</actor>
</actors>
<foo:singers>
<foo:singer id="4">
<name>Michael</name>
<age>60</age>
</foo:singer>
<foo:singer id="5">
<name>Michael</name>
<age>60</age>
</foo:singer>
<foo:singer id="6">
<name>Michael</name>
<age>60</age>
</foo:singer>
</foo:singers>
</root>
我需要解析这个json并将actorUID,actor.name,actor.age,foo:singers.name,foo:singers.age的元素保存到数据库中。
我试过这个:
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(stops));
Document doc = db.parse(is);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("/root/actors");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nl.getLength(); i++) {
Element element = (Element) nl.item(i);
System.out.println(element.getElementsByTagName("actorsUID")
.item(0)
.getTextContent());
System.out.println(element.getElementsByTagName("actor")
.item(0)
.getTextContent());
}
} catch (Exception e) {
e.printStackTrace();
}
我得到这个后如何获得演员姓名 - element.getElementsByTagName("actor")
?
我不想只获取name元素,因为如果我有另外一个孩子到演员,如果它有actress.name,那么它会破坏。
答案 0 :(得分:0)
实际上我建议实现一个SAX解析器。但是如果你想使用xpath,需要注意两点:
DocumentBuilderFactory必须知道命名空间
xpath必须使用NamespaceContext。
您可以将它们设置为:
dbf.setNamespaceAware(true);
javax.xml.namespace.NamespaceContext ns = new javax.xml.namespace.NamespaceContext()
{
@Override
public String getNamespaceURI(String prefix)
{
if ( "foo".equals( prefix ) )
{
return "http://www.foo.org/";
}
else if ( "bar".equals( prefix ) )
{
return "http://www.bar.org/";
}
else if ( "xml".equals( prefix ) )
{
return javax.xml.XMLConstants.XML_NS_URI;
}
return javax.xml.XMLConstants.NULL_NS_URI;
}
@Override
public String getPrefix(String namespaceURI) {
return null;
}
@Override
public Iterator<?> getPrefixes(String namespaceURI) {
return null;
}
};
xpath.setNamespaceContext(ns);
然后,为了获取name
,age
或任何其他子项,您可以使用下面的代码,基本上您可以获得actor
的子节点并打印nodeName,text。
for (int i = 0; i < nl.getLength(); i++)
{
Element element = (Element) nl.item(i);
NodeList uids = element.getElementsByTagName("actorUID");
for ( int j = 0; j < uids.getLength(); j++ )
{
System.out.println( "Actor UID : " + uids.item(j).getTextContent());
}
NodeList actors = element.getElementsByTagName("actor");
for ( int j = 0; j < actors.getLength(); j++ )
{
NodeList cNodes = actors.item(j).getChildNodes();
for ( int k = 0; k < cNodes.getLength(); k++ )
{
Node node = cNodes.item(k);
if ( node.getNodeType() == Node.ELEMENT_NODE )
{
System.out.println( cNodes.item(k).getNodeName() + " : " + cNodes.item(k).getTextContent() );
}
}
}
}