2010-05-22 2 views
0

다음 코드가 있으며 특정 필드에 문제가있어 출력됩니다. 네임 스페이스가 연결되었지만 필수 입력란에 출력되지 않는 것 같습니다. 이것에 대한 정보는 훌륭합니다.Java에서 네임 스페이스로 된 xpath에 출력

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

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPathFactory; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathExpressionException; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 

public class test 
{ 
public static void main(String args[]) 

{ 


    String xmlStr = "<aws:UrlInfoResponse xmlns:aws=\"http://alexa.amazonaws.com/doc/2005-10-05/\">\n" + 
       " <aws:Response xmlns:aws=\"http://awis.amazonaws.com/doc/2005-07-11\">\n" + 
       "  <aws:OperationRequest>\n" + 
       "   <aws:RequestId>blah</aws:RequestId>\n" + 
       "  </aws:OperationRequest>\n" + 
       "  <aws:UrlInfoResult>\n" + 
       "   <aws:Alexa>\n" + 
       "    <aws:TrafficData>\n" + 
       "     <aws:DataUrl type=\"canonical\">harvard.edu/</aws:DataUrl>\n" + 
       "     <aws:Rank>1635</aws:Rank>\n" + 
       "    </aws:TrafficData>\n" + 
       "   </aws:Alexa>\n" + 
       "  </aws:UrlInfoResult>\n" + 
       "  <aws:ResponseStatus xmlns:aws=\"http://alexa.amazonaws.com/doc/2005-10-05/\">\n" + 
       "   <aws:StatusCode>Success</aws:StatusCode>\n" + 
       "  </aws:ResponseStatus>\n" + 
       " </aws:Response>\n" + 
       "</aws:UrlInfoResponse>"; 

        DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); 

        xmlFact.setNamespaceAware(true); 

     DocumentBuilder builder = null; 
     try { 
      builder = xmlFact.newDocumentBuilder(); 
     } catch (ParserConfigurationException e) { 
      e.printStackTrace();  } 

     Document doc = null; 
     try { 
      doc = builder.parse(

    new ByteArrayInputStream(xmlStr.getBytes())); 
     } catch (SAXException e) { 
      e.printStackTrace();  } catch (IOException e) { 
      e.printStackTrace();  } 






    System.out.println(doc.getDocumentElement().getNamespaceURI()); 
    System.out.println(xmlFact.isNamespaceAware()); 

    String xpathStr = "//aws:OperationRequest"; 

      XPathFactory xpathFact = XPathFactory.newInstance(); 

      XPath xpath = xpathFact.newXPath(); 

     String result = null; 
     try { 
      result = xpath.evaluate(xpathStr, doc); 
     } catch (XPathExpressionException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 

     System.out.println("XPath result is \"" + result + "\""); 


} 
} 
+0

접두사 문서와는 XPath에 동일한 경우 URL을 사용하여 declareXPathNameSpace() –

답변

1

Xpath에서 일치하는 네임 스페이스는 접두어와 일치하는 문자열이 아닙니다. 실제로 NamespaceContext 객체를 정의하고이를 xPath와 연결해야합니다. 그것은하지 않습니다 심지어 실제로 전혀 문제는 VTD-XML의 상단에 XPath를 실행하는 경우, 당신은 당신의 XPath 식에 접두사를 연결해야

private NamespaceContext ns = new NamespaceContext() { 
public String getNamespaceURI(String prefix) { 
if (prefix.equals("ns1") return "http://alexa.amazonaws.com/doc/2005-10-05/"; 
else return XMLConstants.NULL_NS_URI; 
} 
public String getPrefix(String namespace) { 
throw new UnsupportedOperationException(); 
} 
public Iterator getPrefixes(String namespace) { 
throw new UnsupportedOperationException(); 
}}; 

XPathFactory xpfactory = XPathFactory.newInstance(); 
XPath xpath = xpfactory.newXPath(); 
xpath.setNamespaceContext(ns); 

String xpathStr = "//ns1:OperationRequest"; 
//and so on 
관련 문제