8

これは入力 XML です。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns2:SendResponse xmlns:ns2="http://mycompany.com/schema/">
         <ns2:SendResult>
            <ns2:Token>A00179-02</ns2:Token>
         </ns2:SendResult>
      </ns2:SendResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

これは、XML を読み取るために使用しているコードです (変数 xmlString には上記の XML が含まれています)。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xmlString));
Document doc = db.parse(is);

System.out.println("Element :" + doc.getElementsByTagName("Token").item(0));
System.out.println("Element :" + doc.getElementsByTagName("ns2:Token").item(0));

出力:

Element :null
Element :[ns2:Token: null]

タグ名として「ns2:Token」を使用すると要素を読み取ることができますが、コードでプレフィックスを使用したくありません。それが同じか変更されるかどうかわからないからです。未来。タグ名に名前空間をハードコーディングせずに xml 要素を読み取る方法はありますか?

4

4 に答える 4

0

XPath 式を使用してみてください。以下のサンプルコードを参照してください。

Document doc = dBuilder.parse(new ByteArrayInputStream(responseXML.getBytes()));
doc.getDocumentElement().normalize();
XPath xPath =  XPathFactory.newInstance().newXPath();

String expression = "/ns6:ReadPersonReturn/ns6:object/ns3:Person/ns3:Phone/ns3:item";
NodeList nodes = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
Element secondNode = null;
if(nodes != null && nodes.getLength() > 0){
    secondNode = (Element) leadCloudPingRecordNodes.item(i);
}
于 2016-02-24T07:15:45.670 に答える
0

名前空間をいつでも変数に割り当てることができます。これにより、将来的にその場で変更することができます。

于 2013-05-17T20:19:07.250 に答える