2017-01-11 21 views
0

xmlに名前空間はありますが、プレフィックスはありません。私はxpathsを持っていますが、Schematronから生成された接頭辞を持っています。私は接頭辞付きのxpathを使ってそのXMLから要素の詳細を取得したい。ここでXpathを使用してXmlを名前空間で解析する方法java

は私が

HashMap<String, String> prefMap = new HashMap<String, String>() { 
       { 
        put("q", "foo"); 
       } 
      }; 
MyNameSpaceContext namespaces = new MyNameSpaceContext(prefMap); 
xPath.setNamespaceContext(namespaces); 

を試してみましたが、ここにMyNameSpaceContext

でてきたので、私はNameSpaceContextインタフェースについて読み、私のXML

<?xml version="1.0" encoding="UTF-8"?> 
<section xmlns="http://foo" type="abc" id="ad"> 
    <title>Document Title</title> 
    <body> 
     <p> 
      <t>Document Body</t> 
     </p> 
     <p> 
      <t>Document Body</t> 
     </p> 
     <p> 
      <t>Document Body</t> 
     </p> 
    </body> 
</section> 

そして、ここでは、Javaコード

package com; 

import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Iterator; 

import javax.xml.namespace.NamespaceContext; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

public class XPathTest { 
    public static void main(String[] args) { 
     File inputFile = new File("files/my_xml.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder; 
     try { 
      dBuilder = dbFactory.newDocumentBuilder(); 
      Document doc = dBuilder.parse(inputFile); 
      doc.getDocumentElement().normalize(); 

      XPath xPath = XPathFactory.newInstance().newXPath(); 

      HashMap<String, String> prefMap = new HashMap<String, String>() { 
       { 
        put("q", "http://foo"); 
       } 
      }; 
      SmartContentNameSpaceContext namespaces = new SmartContentNameSpaceContext(prefMap); 
      xPath.setNamespaceContext(namespaces); 

      String expression = "//q:section[1]"; 
      NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET); 

      for (int i = 0; i < nodeList.getLength(); i++) { 
       Node node = nodeList.item(i); 

       System.out.println(node.getAttributes().item(0)); 
       System.out.println("current element : " + node.getNodeName()); 
      } 
     } catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (XPathExpressionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

です

package com; 

import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 

import javax.xml.namespace.NamespaceContext; 

public class MyNameSpaceContext implements NamespaceContext { 

    private final Map<String, String> PREF_MAP = new HashMap<String, String>(); 

    public SmartContentNameSpaceContext(final Map<String, String> prefMap) { 
     PREF_MAP.putAll(prefMap); 
    } 

    @Override 
    public String getNamespaceURI(String prefix) { 
     return PREF_MAP.get(prefix); 
    } 

    @Override 
    public String getPrefix(String namespaceURI) { 
     return null; 
    } 

    @Override 
    public Iterator getPrefixes(String namespaceURI) { 
     return null; 
    } 

} 

しかし、これはうまくいきませんか?

答えて

1

あなたはDOMツリー上でXPathを使用したい場合は、

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
dbFactory.setNamespaceAware(true); 

を使用していることを確認する必要があります。私は他の問題をさらに検討していません。

関連する問題