2016-05-17 13 views
0

を返し、次の通りである:任意の例外がスローされることなく、JDomには、私はXMLと私が使用したコードを解析しようとしている、ヌル

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

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import java.io.IOException; 
import java.io.StringReader; 

public class Main { 

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException { 
     String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:comm3=\"http://www.csapi.org/schema/parlayx/common/v3_1\" xmlns:sms7=\"http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local\">\r\n <SOAP-ENV:Header>\r\n <comm3:NotifySOAPHeader>\r\n  <spId>37</spId>\r\n </comm3:NotifySOAPHeader>\r\n </SOAP-ENV:Header>\r\n <SOAP-ENV:Body SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n <sms7:notifySmsDeliveryReceipt>\r\n  <sms7:correlator>123</sms7:correlator>\r\n  <sms7:deliveryStatus>\r\n  <address>tel:959257118550</address>\r\n  <deliveryStatus>DeliveredToTerminal</deliveryStatus>\r\n  </sms7:deliveryStatus>\r\n </sms7:notifySmsDeliveryReceipt>\r\n </SOAP-ENV:Body>\r\n</SOAP-ENV:Envelope>\r\n"; 
     System.out.println("xml:"); 
     System.out.println(xml); 

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

     DocumentBuilder loader = factory.newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(xml)); 

     Document doc = loader.parse(is); 

     NodeList nodeList = doc.getElementsByTagNameNS("http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local", "correlator"); 
     Element correlatorElement = (Element) nodeList.item(0); 
     System.out.println(correlatorElement); 

     NodeList addressNodeList = doc.getElementsByTagName("address"); 
     System.out.println(addressNodeList.item(0)); 
    } 
} 

、コードは結果を出力しますが、私たちが取得することは、我々が期待するものではありません。

xml: 
<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:comm3="http://www.csapi.org/schema/parlayx/common/v3_1" xmlns:sms7="http://www.csapi.org/schema/parlayx/sms/notification/v3_1/local"> 
    <SOAP-ENV:Header> 
    <comm3:NotifySOAPHeader> 
     <spId>37</spId> 
    </comm3:NotifySOAPHeader> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <sms7:notifySmsDeliveryReceipt> 
     <sms7:correlator>123</sms7:correlator> 
     <sms7:deliveryStatus> 
     <address>tel:959257118550</address> 
     <deliveryStatus>DeliveredToTerminal</deliveryStatus> 
     </sms7:deliveryStatus> 
    </sms7:notifySmsDeliveryReceipt> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

[sms7:correlator: null] 
[address: null] 

Process finished with exit code 0 

なぜ値nullは?

答えて

1

ISTが動作していない理由を3理由が、あります:

  1. ノードが実際には存在しません!
  2. ノードが異なる名前空間にあり、名前空間を受け入れるメソッドのバージョン(Element#getChild(String, Namespace)またはElement#getChildText(String, Namespace))を使用する必要があります。
  3. 最も重要なことに、これらのメソッドはノードの直下の子孫のみを返します。したがって、nthレベルにネストされたノードを取得する場合は、ツリーを親ノードに移動してから、#getChild()に電話して実際に子を取得する必要があります。
関連する問題