代码之家  ›  专栏  ›  技术社区  ›  VelNaga

使用XPath使用Java存储XML值作为映射

  •  0
  • VelNaga  · 技术社区  · 7 年前

    我正在使用xpath解析XML文档,请在下面找到XML

    <?xml version="1.0" encoding="UTF-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
            <bookEvent>
                <bookName>harry_potter</bookName>
                <bookEntity>comic</bookEntity>
                <bookEntityId>10987645</bookEntityId>
                <bookParameter>
                    <name>Name1</name>
                    <value>value1</value>
                </bookParameter>
                <bookParameter>
                    <name>Name2</name>
                    <value>value2</value>
                </bookParameter>
                <bookParameter>
                    <name>Name3</name>
                    <value>value3</value>
                </bookParameter>
                <bookParameter>
                    <name>Name4</name>
                    <value>value4</value>
                </bookParameter>
                <bookParameter>
                    <name>Name5</name>
                    <value>value5</value>
                </bookParameter>
            </bookEvent>
        </soap:Body>
    </soap:Envelope>
    

    在这里我想把BookParameters转换成下面的map

    {"Name1":"value1","Name2":"value2" etc}
    

    我已经尝试了下面的代码,我可以得到一个地图,但不是预期的格式,

          try{
            Map<String,String> eventParameters = new HashMap<>();
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse("book.xml");
            XPathFactory xPathfactory = XPathFactory.newInstance();
            XPath xpath = xPathfactory.newXPath();
            NodeList nodeList = (NodeList)xpath.compile("//bookEvent//eventParameter").evaluate(doc, XPathConstants.NODESET);
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if(node.hasChildNodes()) {
                    NodeList childNodes = node.getChildNodes();
                    for (int j = 0; j < childNodes.getLength(); j++) {
                        Node childNode = childNodes.item(j);
                        if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                            System.out.println(childNode.getNodeName()+"::"+childNode.getNodeValue()+"::"+childNode.getTextContent());
                            eventParameters.put(childNode.getTextContent(),childNode.getTextContent());
                        }
                    }
                }
            }
            System.out.println("print map::"+eventParameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    

    输出如下

    print map::{Name3=Name3, Name4=Name4, value5=value5, Name5=Name5, value2=value2, value1=value1, value4=value4, value3=value3, Name1=Name1, Name2=Name2}
    

    请有人指导我从XML创建一个下面的映射,任何帮助都是可以理解的。

    “name1”:“value1”,“name2”:“value2”等
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   dangi13    7 年前

    import java.io.File;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    public class ReadXMLFile {
    
        public static Map<String,String> hMap = new LinkedHashMap<>();
        public static void main(String argv[]) {
    
            try {
    
                File fXmlFile = new File("C:\\Users\\jaikant\\Desktop\\QUESTION.xml");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fXmlFile);
                doc.getDocumentElement().normalize();
    
                NodeList nodeList = doc.getElementsByTagName("bookParameter");
    
                for (int parameter = 0; parameter < nodeList.getLength(); parameter++) {
                    Node node = nodeList.item(parameter);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) node;
                        String name = eElement.getElementsByTagName("name").item(0).getTextContent();
                        String value = eElement.getElementsByTagName("value").item(0).getTextContent();
                        hMap.put(name, value);
    
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            hMap.forEach((h,k) -> {
                System.out.println(h + ":" + k);
            });
        }
    
    }
    

        2
  •  1
  •   Michael Kay    7 年前

    map:merge(//bookParameter!map{string(name): string(value)}) 
       => serialize(map{'method':'json'})