使用 Java 获取不基于命名空间的 xml 标签
Fetch xml tag not based on namespace using Java
我有这个响应字符串 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、
传递
我怎样才能做到这一点,而不是基于名称空间标记。
1) 您已经在不使用命名空间的情况下获取节点。所以我没有看到问题。
2) 在您的第二种方法中也使用 * 搜索,即在您的 getElementTextContent() 中,使用 el.getElementsByTagNameNS("*",elemTag)
.
3) 要在将其传递给 getElementTextContent 之前跳过 ns: 前缀,请使用 getLocalName()
而不是 getNodeName()
安装 XPath 2.0 库并执行 //*:finStatus
。通过 DOM 导航来执行此操作只是受虐狂。要么,要么您将根据编写的代码行数获得报酬。
我有这个响应字符串 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、
传递我怎样才能做到这一点,而不是基于名称空间标记。
1) 您已经在不使用命名空间的情况下获取节点。所以我没有看到问题。
2) 在您的第二种方法中也使用 * 搜索,即在您的 getElementTextContent() 中,使用 el.getElementsByTagNameNS("*",elemTag)
.
3) 要在将其传递给 getElementTextContent 之前跳过 ns: 前缀,请使用 getLocalName()
而不是 getNodeName()
安装 XPath 2.0 库并执行 //*:finStatus
。通过 DOM 导航来执行此操作只是受虐狂。要么,要么您将根据编写的代码行数获得报酬。