Java:解析XML并将所有数据内容绑定到地图<;K、 V>;

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>

我正在尝试开发一个特定于我们项目的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>
或者,对于节点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();