Java:解析XML并将所有数据内容绑定到地图<;K、 V>;
我正在尝试开发一个特定于我们项目的SOAP客户端和解析器。我已经完成了客户端,它调用了多种(几种不同的)SOAP web服务,并以XML格式获取响应SOAP消息 我的目标: 从任何类型的集合中获取任何节点或属性的值,它应该适用于我的所有web服务响应 例如,我会这样打电话:Java:解析XML并将所有数据内容绑定到地图<;K、 V>;,java,xml,parsing,xpath,xstream,Java,Xml,Parsing,Xpath,Xstream,我正在尝试开发一个特定于我们项目的SOAP客户端和解析器。我已经完成了客户端,它调用了多种(几种不同的)SOAP web服务,并以XML格式获取响应SOAP消息 我的目标: 从任何类型的集合中获取任何节点或属性的值,它应该适用于我的所有web服务响应 例如,我会这样打电话: String h1 = collection.get("html/body/h1"); h1的值应为“StackOverflow”,并来自: <html> <head></head>
String h1 = collection.get("html/body/h1");
h1的值应为“StackOverflow”,并来自:
<html>
<head></head>
<body>
<h1>StackOverflow</h1>
<p>XML parsing in Java</p>
</body>
</html>
或者,对于节点3:
String node3Value = map.get("/MethodResponse/Node1/Node2/Node3");
就像XPath一样。但是我不想要任何映射或任何Java类。我只想从其路径访问节点(或属性)值
成功标准:
它适用于这些和几个不同的SOAP消息:
使用javax.XML.parsers.DocumentBuilderFactory类创建Java DOM XML解析器。以下是一个例子:
DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = builderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
使用DocumentBuilder将XML文件解析为DOM树的过程如下:
try {
Document document = builder.parse(
new FileInputStream("data\\text.xml"));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element rootElement = document.getDocumentElement();
顶部是文档对象。Document对象有一个根元素,通过调用getDocumentElement()返回,如下所示:
try {
Document document = builder.parse(
new FileInputStream("data\\text.xml"));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Element rootElement = document.getDocumentElement();
获取元素的子元素
NodeList nodes = element.getChildNodes();
for(int i=0; i<nodes.getLength(); i++){
Node node = nodes.item(i);
if(node instanceof Element){
//a child element to process
Element child = (Element) node;
String attribute = child.getAttribute("width");
}
}
这并不像你现在想象的那么简单。您将遇到具有相同路径的元素—如html/body/table/tr/td—因此,将映射思想序列化/取消序列化为具有层次结构的对象集不会更好。谷歌
javajaxb
@archer不幸的是,我应该在不使用任何类/对象的情况下完成它。请阅读@MarcoForberg所说的内容。使用纯映射实现您的解决方案几乎是不可能的。
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
StringWriter buffer = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(document),
new StreamResult(buffer));
String str = buffer.toString();