我正在尝试解析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

最佳答案

有3个原因,为什么ist不起作用:


该节点确实不存在!
该节点位于另一个名称空间中,您需要使用也接受名称空间的方法版本:Element#getChild(String, Namespace)Element#getChildText(String, Namespace)
最重要的是,请记住,这些方法仅返回节点的直接后代!因此,如果您希望嵌套在nth级别的节点,则需要将树移到其父节点,然后才能调用#getChild()并真正获得子节点!

10-06 07:00