在 java 中使用 Xerces DOMParser 嵌套 xml 解析
nested xml parseing using Xerces DOMParser in java
我有字符串 xml
。我想解析这个 xml
以获得如下输出。
输入
<?xml version="1.0" encoding="UTF-8"?>
<req:messages xmlns:req="http://hp.com/ecc/request/">
<req:message category="GENERIC" type="error" number="6">Null pointer exception occured.</req:message>
<req:message category="GENERIC" type="error" number="6">Arithmetic exception occured.</req:message>
<req:message category="GENERIC" type="error" number="6">Class not found exception occured.</req:message>
</req:messages>
输出
Null pointer exception occured.
Arithmetic exception occured.
Class not found exception occured.
到目前为止我已经试过了
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof org.w3c.dom.CharacterData) {
org.w3c.dom.CharacterData cd = ( org.w3c.dom.CharacterData) child;
return cd.getData();
}
return "";
}
private String parseXmlData() throws ParserConfigurationException, SAXException, IOException {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><req:messages xmlns:req=\"http://hp.com/ecc/request/\"><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Null pointer exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Arithmetic exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Class not found exception occured.</req:message></req:messages>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(str));
Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("req:messages");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
NodeList name = element.getElementsByTagName("req:message");
Element line = (Element) name.item(0);
sb.append(getCharacterDataFromElement(line) + System.lineSeparator());
}
return sb.toString();
}
public static void main(String args[]) {
try{
String data = parseXmlData();
System.out.println(data);
} catch(Exceprtion e) {
}
}
使用上面的程序我只能得到如下第一个错误。
Null pointer exception occured.
您正在迭代错误的节点。您有多个 'req:message' 标签,而不是 'req:messages'。希望您能理解。请检查此代码
在这里你可以直接得到'req:message'个元素并迭代它..
private static String parseXmlData() throws ParserConfigurationException, SAXException, IOException {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><req:messages xmlns:req=\"http://hp.com/ecc/request/\"><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Null pointer exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Arithmetic exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Class not found exception occured.</req:message></req:messages>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(str));
Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("req:message");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
sb.append(getCharacterDataFromElement(element) + System.lineSeparator());
}
return sb.toString();
}
或者如果您只想要 'req:messages' 标签下的 'req:message' 个元素,请使用此代码...
private static String parseXmlData() throws ParserConfigurationException, SAXException, IOException {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><req:messages xmlns:req=\"http://hp.com/ecc/request/\"><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Null pointer exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Arithmetic exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Class not found exception occured.</req:message></req:messages>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(str));
Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("req:messages");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
NodeList names = element.getElementsByTagName("req:message");
for (int j = 0; j < names.getLength(); j++) {
Element line = (Element) names.item(j);
sb.append(getCharacterDataFromElement(line) + System.lineSeparator());
}
}
return sb.toString();
}
我有字符串 xml
。我想解析这个 xml
以获得如下输出。
输入
<?xml version="1.0" encoding="UTF-8"?>
<req:messages xmlns:req="http://hp.com/ecc/request/">
<req:message category="GENERIC" type="error" number="6">Null pointer exception occured.</req:message>
<req:message category="GENERIC" type="error" number="6">Arithmetic exception occured.</req:message>
<req:message category="GENERIC" type="error" number="6">Class not found exception occured.</req:message>
</req:messages>
输出
Null pointer exception occured.
Arithmetic exception occured.
Class not found exception occured.
到目前为止我已经试过了
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof org.w3c.dom.CharacterData) {
org.w3c.dom.CharacterData cd = ( org.w3c.dom.CharacterData) child;
return cd.getData();
}
return "";
}
private String parseXmlData() throws ParserConfigurationException, SAXException, IOException {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><req:messages xmlns:req=\"http://hp.com/ecc/request/\"><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Null pointer exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Arithmetic exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Class not found exception occured.</req:message></req:messages>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(str));
Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("req:messages");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
NodeList name = element.getElementsByTagName("req:message");
Element line = (Element) name.item(0);
sb.append(getCharacterDataFromElement(line) + System.lineSeparator());
}
return sb.toString();
}
public static void main(String args[]) {
try{
String data = parseXmlData();
System.out.println(data);
} catch(Exceprtion e) {
}
}
使用上面的程序我只能得到如下第一个错误。
Null pointer exception occured.
您正在迭代错误的节点。您有多个 'req:message' 标签,而不是 'req:messages'。希望您能理解。请检查此代码
在这里你可以直接得到'req:message'个元素并迭代它..
private static String parseXmlData() throws ParserConfigurationException, SAXException, IOException {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><req:messages xmlns:req=\"http://hp.com/ecc/request/\"><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Null pointer exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Arithmetic exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Class not found exception occured.</req:message></req:messages>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(str));
Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("req:message");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
sb.append(getCharacterDataFromElement(element) + System.lineSeparator());
}
return sb.toString();
}
或者如果您只想要 'req:messages' 标签下的 'req:message' 个元素,请使用此代码...
private static String parseXmlData() throws ParserConfigurationException, SAXException, IOException {
String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><req:messages xmlns:req=\"http://hp.com/ecc/request/\"><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Null pointer exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Arithmetic exception occured.</req:message><req:message category=\"GENERIC\" type=\"error\" number=\"6\">Class not found exception occured.</req:message></req:messages>";
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(str));
Document doc = db.parse(is);
NodeList nodes = doc.getElementsByTagName("req:messages");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
NodeList names = element.getElementsByTagName("req:message");
for (int j = 0; j < names.getLength(); j++) {
Element line = (Element) names.item(j);
sb.append(getCharacterDataFromElement(line) + System.lineSeparator());
}
}
return sb.toString();
}