Java 如何将XML转换为忽略父子关系的哈希映射
我有以下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
<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;
}
}