未使用 NodeList 获取 XML 标记值



我把这个响应XML作为字符串

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
  <ns:SRVResponse>
     <ns:Response>
        <ns1:ServiceHeader>
           <ns1:rsHeader>
              <ns1:status>
                 <ns1:finStatus>E</ns1:finStatus>
                 </ns1:status>
            </ns1:rsHeader>
        </ns1:ServiceHeader>
    </ns:Response>
</ns:SRVResponse>
</soapenv:Body>
</soapenv:Envelope>

我试图获取 finStatus。此标记值有时带有 ns1 或 ns2 等。但我只需要获取finStatus的值。

我尝试以下方式。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                           dbf.setNamespaceAware(true);
                           DocumentBuilder db = dbf.newDocumentBuilder();
                           InputSource is = new InputSource();                                 
                            is.setCharacterStream(new StringReader(strResponse));
                            if(is != null) {
                                Document doc = db.parse(is);
                                NodeList idDetails =  doc.getDocumentElement().getElementsByTagNameNS("*", "finStatus");
                                if(idDetails != null) {
                                    int length = idDetails.getLength();
                                    for (int i = 0; i < length; i++) {
                                        if (idDetails.item(i).getNodeType() == Node.ELEMENT_NODE) {
                                            Element el = (Element) idDetails.item(i);
                                            if (el.getNodeName().contains("finStatus")) {
                                                status = getElementTextContent(el, "finStatus");
                                                System.out
                                                        .println("Status :"+status);
                                            }
                                        }
                                    }
                                }
                            }

getElementTextContent的方法如下

public static String getElementTextContent(Element el, String elemTag) {
    String result = "";
    if(el.getElementsByTagName(elemTag) != null) {
        if(el.getElementsByTagName(elemTag).item(0) != null) {
            if(el.getElementsByTagName(elemTag).item(0).getTextContent() != null) {
                result = el.getElementsByTagName(elemTag).item(0).getTextContent();
            } else {
                result = "";
            }
        }
    }
    return result;
}

我没有收到任何异常,而是获得空值。这个缺少什么?任何想法将不胜感激。

你可以试试这个,因为它在我的代码中工作。

这是我正在使用的 xml

     * xmlInput =
     * "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">rn"
     * + "    <soap:Body>rn" +
     * "        <ns1:LoginProcesRequest xmlns:ns1="http://xmlns.oracle.com/BioRad_jws/BR_GetSFDCLogin/GetSFDCDetailsProcess">rn"
     * + "           <ns1:Login>1000</ns1:Login>rn" +
     * "           <ns1:Company>1000</ns1:Company>rn" +
     * "        </ns1:LoginProcesRequest>rn" + "    </soap:Body>rn" +
     * "</soap:Envelope>";
     */

使用

 StringWriter out = new StringWriter();
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        Source sourceContent = soapResponse.getSOAPPart().getContent();
        transformer.transform(sourceContent, new StreamResult(out));
        String response = out.toString();
DocumentBuilderFactory docFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(new InputSource(new StringReader(
                    response)));
            XPathFactory factory = XPathFactory.newInstance();
            XPath xpath = factory.newXPath();
            header.setSessionId((String) xpath
                    .evaluate(
                            "/Envelope/Body/LoginProcessResponse/loginResponse/sessionId",
                            doc, XPathConstants.STRING));

最新更新