使用Java获取不基于命名空间的xml标记

时间:2017-10-10 05:09:16

标签: java xml xml-parsing nodelist

我将此响应字符串作为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("*", "status");
                                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("status")) {
                                                status = getElementTextContent(el, "ns1:finStatus");
                                                System.out
                                                        .println("Status :"+status);
                                            }
                                        }
                                    }
                                }
                            }

方法

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;
}

这只是因为我将标签传递为ns1:finStatus,

我如何实现这一点,而不是基于命名空间标记。

2 个答案:

答案 0 :(得分:1)

1)您已经在不使用命名空间的情况下获取节点。所以我没有看到问题。

2)在第二种方法中也使用* search,即在getElementTextContent()中,使用el.getElementsByTagNameNS("*",elemTag)

3)要在将ns:前缀传递给getElementTextContent之前跳过ns:前缀,请使用getLocalName()代替getNodeName()

答案 1 :(得分:1)

安装XPath 2.0库并执行//*:finStatus。通过DOM导航执行此操作只是受虐狂。或者,或者你为你写的代码行数付出了代价。