2

我正在尝试开发一个特定于我们项目的 SOAP 客户端和解析器。我已经完成了客​​户端,它调用了多种(几种不同的)SOAP Web 服务并以 XML 格式获取响应 SOAP 消息。

我的目标:

从任何类型的集合中获取任何节点或属性的值,它应该适用于我的所有 Web 服务响应。

例如,我会这样称呼:

String h1 = collection.get("html/body/h1");

h1 的值应该是 'StackOverflow' 并且来自:

<html>
  <head></head>
  <body>
    <h1>StackOverflow</h1>
    <p>XML parsing in Java</p>
  </body>
</html>

等等

我的做法:

现在我有响应消息。我想解析它并将所有节点(和属性)值分配给一个集合(映射)并从该集合中获取数据。集合的 (Map)将是节点的路径,将是节点或属性的值。

例如

<MethodResponse xmlns="any.xmlns">
    <MethodResult>any value</MethodResult>
    <Node1>
        <Node2>
            <Node3>
                node3 value is here
            <Node3>
        </Node2>
    </Node1>
    <respCode>99</respCode>
    <respNote>any value</respNote>
</MethodResponse>

如果我需要在这里 respCode,我可以这样调用:

String respCode = map.get("/MethodResponse/respCode");

或者,到 Node3:

String node3Value = map.get("/MethodResponse/Node1/Node2/Node3");

就像 XPath。但我不想要任何映射或任何 Java 类。我只想从其路径访问节点(或属性)值。

成功标准:

它适用于这些和几个不同的 SOAP 消息:

还有我的问题:

  1. 我的方法是真的吗?
  2. 如果是,我该怎么做?是否有任何工作代码或教程?
  3. 如果没有,我该怎么做?
4

1 回答 1

1

使用 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();
}

顶部是 Document 对象。Document 对象有一个根元素,它通过调用 getDocumentElement() 返回,如下所示:

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

现在你有了一个需要的节点,所以你可以根据需要创建把它放在地图中,并且需要你的键。方法transformer.transform(new DOMSource(document),使用任何Dom节点或元素

从文档创建字符串

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();
于 2013-10-11T12:15:41.247 回答