Java 如何将XML转换为忽略父子关系的哈希映射

Java 如何将XML转换为忽略父子关系的哈希映射,java,json,xml,jaxb,Java,Json,Xml,Jaxb,我有以下XML: <XmlParent> <name>koraytugay</name> <bar> <baz> <to>Tove</to> <qux>00000001</qux> </baz> </bar> <note> &l

我有以下XML:

<XmlParent>
    <name>koraytugay</name>
    <bar>
        <baz>
            <to>Tove</to>
            <qux>00000001</qux>
        </baz>
    </bar>
    <note>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
    </note>
</XmlParent>
现在我是这样得到的

    XmlParent:
    {
        name:koraytugay
        bar:
        {
            baz: 
            {
                to:Tove
                qux:00000001
            }
        }
        note:
        {
            from:Jani
            heading:Reminder
            body:Don't forget me this weekend!
        }
    }
}
我试过多种不同的方法。 我有一个类似这样的XSD(从schema标记中删除了实际数据,但效果很好)


初稿
这就是我目前正在做的

private static final Log LOGGER = LogFactory.getLog(XmlConverter.class);

    public Map<String, Object> xmlStringToHashMap(String xml) {
        JSON json = xmlStringToJSON(xml);

        return jsonToMap(json.toString(2));

    }

    public Map<String, Object> jsonToMap(String jsonString) {
        ObjectMapper mapper = new ObjectMapper();

        try {

            Map<String, Object> jsonInMap = mapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {
            });

            LOGGER.info("JSON Map created: " + jsonInMap);

            return jsonInMap;
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return null;
    }

    public JSON xmlStringToJSON(String xml) {
        XMLSerializer xmlSerializer = new XMLSerializer();
        return xmlSerializer.read(xml);

    }
private static final Log LOGGER=LogFactory.getLog(XmlConverter.class);
公共映射xmlStringToHashMap(字符串xml){
JSON=xmlStringToJSON(xml);
返回jsonToMap(json.toString(2));
}
公共映射jsonToMap(字符串jsonString){
ObjectMapper mapper=新的ObjectMapper();
试一试{
Map jsonInMap=mapper.readValue(jsonString,new TypeReference()){
});
info(“创建的JSON映射:”+jsonInMap);
返回jsonInMap;
}捕获(IOE异常){
LOGGER.error(例如getMessage());
}
返回null;
}
公共JSON xmlStringToJSON(字符串xml){
XMLSerializer XMLSerializer=新的XMLSerializer();
返回xmlSerializer.read(xml);
}

您知道如何在忽略父标记的情况下将元素及其数据添加到一个JSON文件或HashMap中吗?

您可能想看看解析HTML或XML的Java库。当我想在不需要编写大量代码的情况下完成工作时,我经常使用它。对于您给出的示例:

import java.util.HashMap;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;

public class NewClass3 {
    public static void main(String[] args) {
        String xml = "<XmlParent>\n" +
                        "    <name>koraytugay</name>\n" +
                        "    <bar>\n" +
                        "        <baz>\n" +
                        "            <to>Tove</to>\n" +
                        "            <qux>00000001</qux>\n" +
                        "        </baz>\n" +
                        "    </bar>\n" +
                        "    <note>\n" +
                        "        <from>Jani</from>\n" +
                        "        <heading>Reminder</heading>\n" +
                        "        <body>Don't forget me this weekend!</body>\n" +
                        "    </note>\n" +
                        "</XmlParent>";

        Document doc    = Jsoup.parse(xml, "", Parser.xmlParser());
        Element to      = doc.selectFirst("to");
        Element from    = doc.selectFirst("from");
        Element qux     = doc.selectFirst("qux");
        Element heading = doc.selectFirst("heading");
        Element body    = doc.selectFirst("body");

        //print put in map or whatever...
        System.out.println("to: "   + to.text());
        System.out.println("from: " + qux.text());

        Map<String,String> map = new HashMap<>();
        map.put("to", to.text());
    }    
}
import java.util.HashMap;
导入java.util.Map;
导入org.jsoup.jsoup;
导入org.jsoup.nodes.Document;
导入org.jsoup.nodes.Element;
导入org.jsoup.parser.parser;
公共类NewClass3{
公共静态void main(字符串[]args){
字符串xml=“\n”+
“koraytugay\n”+
“\n”+
“\n”+
“Tove\n”+
“00000001\n”+
“\n”+
“\n”+
“\n”+
“Jani\n”+
“提醒\n”+
“这个周末别忘了我!\n”+
“\n”+
"";
Document doc=Jsoup.parse(xml,“,Parser.xmlParser());
元素到=文件。选择第一个(“到”);
Element from=doc.selectFirst(“from”);
元素qux=doc.selectFirst(“qux”);
元素标题=doc.selectFirst(“标题”);
元素主体=文件。选择第一个(“主体”);
//打印放在地图上或其他什么。。。
System.out.println(“to:+to.text());
System.out.println(“from:+qux.text());
Map Map=newhashmap();
map.put(“to”,to.text());
}    
}

我使用XPath表达式
///to/text()

以下是我的解决方案:

private String[] elements;

    public Map<String, Object> xPathParser(String xmlString) {
        try {
            Document xmlDoc = xmlStringToDocument(xmlString);

            XPath xpath = XPathFactory.newInstance().newXPath();
            String expression;
            Map<String, Object> elements = new HashMap<>();
            for (String element : elements) {
                expression = MessageFormat.format("//{0}/text()", element);

                Object xpathValue = xpath.compile(expression).evaluate(xmlDoc, XPathConstants.STRING);

                elements.put(element, xpathValue);
            }

            return elements;

        } catch (SAXException | IOException | ParserConfigurationException | XPathExpressionException e) {
            LOGGER.error(e.toString());
            return null;
        }
    }
私有字符串[]元素;
公共映射xPathParser(字符串xmlString){
试一试{
文档xmlDoc=xmlStringToDocument(xmlString);
XPath=XPathFactory.newInstance().newXPath();
字符串表达式;
Map elements=newhashmap();
for(字符串元素:元素){
expression=MessageFormat.format(“//{0}/text()”,元素);
对象xpathValue=xpath.compile(expression.evaluate)(xmlDoc,XPathConstants.STRING);
元素。put(元素,xpathValue);
}
返回元素;
}捕获(SAXException | IOException | ParserConfiguration Exception | XPathExpressionException e){
LOGGER.error(例如toString());
返回null;
}
}

尝试使用类似于
///to/text()
的Xpath表达式,以获取XML文档中任何位置的
元素的内容。您有这样做的示例吗?看看这正是我想要的!非常感谢。
import java.util.HashMap;
import java.util.Map;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;

public class NewClass3 {
    public static void main(String[] args) {
        String xml = "<XmlParent>\n" +
                        "    <name>koraytugay</name>\n" +
                        "    <bar>\n" +
                        "        <baz>\n" +
                        "            <to>Tove</to>\n" +
                        "            <qux>00000001</qux>\n" +
                        "        </baz>\n" +
                        "    </bar>\n" +
                        "    <note>\n" +
                        "        <from>Jani</from>\n" +
                        "        <heading>Reminder</heading>\n" +
                        "        <body>Don't forget me this weekend!</body>\n" +
                        "    </note>\n" +
                        "</XmlParent>";

        Document doc    = Jsoup.parse(xml, "", Parser.xmlParser());
        Element to      = doc.selectFirst("to");
        Element from    = doc.selectFirst("from");
        Element qux     = doc.selectFirst("qux");
        Element heading = doc.selectFirst("heading");
        Element body    = doc.selectFirst("body");

        //print put in map or whatever...
        System.out.println("to: "   + to.text());
        System.out.println("from: " + qux.text());

        Map<String,String> map = new HashMap<>();
        map.put("to", to.text());
    }    
}
private String[] elements;

    public Map<String, Object> xPathParser(String xmlString) {
        try {
            Document xmlDoc = xmlStringToDocument(xmlString);

            XPath xpath = XPathFactory.newInstance().newXPath();
            String expression;
            Map<String, Object> elements = new HashMap<>();
            for (String element : elements) {
                expression = MessageFormat.format("//{0}/text()", element);

                Object xpathValue = xpath.compile(expression).evaluate(xmlDoc, XPathConstants.STRING);

                elements.put(element, xpathValue);
            }

            return elements;

        } catch (SAXException | IOException | ParserConfigurationException | XPathExpressionException e) {
            LOGGER.error(e.toString());
            return null;
        }
    }