2017-07-12 11 views
0

したがって、私はこのように見えるXML構造を持っています。データベースへのsingers.age:singers.name、FOO:xpathを使用してxpathを解析し、ネストされた子を取得する

<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の要素を保存する必要があります。

私はこれを試してみました:私はこれを得た後

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")

名前の要素を取得したいとは思っていません。さらに、他の子供たちに俳優を迎えてもらいたいのですが、もしactress.nameがあれば、それは壊れます。

答えて

0

実際、私はSAXパーサーの実装をお勧めします。あなたは、XPathを使用したい場合はしかし、二つのことに注意します

  • のDocumentBuilderFactoryが

  • xpathがNamespaceContextを使用しなければならない名前空間を認識することがあります。

あなたは次のようにそれらを設定することもできます、基本的にあなたがactorの子ノードと印刷のnodeNameを取得し、その後nameage、または任意の他の子を取得するために、あなたはコードの下に使用することができ

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); 

テキスト。

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()); 
      } 

     } 
    } 
} 
関連する問題