Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将xpath表达式结果转换为json_Java_Xml_Json - Fatal编程技术网

Java 将xpath表达式结果转换为json

Java 将xpath表达式结果转换为json,java,xml,json,Java,Xml,Json,我想将dom节点列表转换为json数组,并将结果发送到rest客户端: xml的每个节点表示以下内容: <A NAME="x" COUNT="y"> <B KEY="z1" VALUE="z2"/> <B KEY="z3" VALUE="z4"/> </A> {"NAME":"x"

我想将dom节点列表转换为json数组,并将结果发送到rest客户端:

xml的每个节点表示以下内容:

<A NAME="x" COUNT="y">
  <B KEY="z1" VALUE="z2"/>
  <B KEY="z3" VALUE="z4"/>
</A>
{"NAME":"x", 
 "COUNT":"y", 
 "B": [ {"KEY": "z1,  VALUE:"z2"},
        {"KEY":"z3", VALUE:"z4"} ]
}
我尝试使用GSON库:

package com.a;


import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Test {
    private static final String XPATH = "/A/B";
    
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException {
        File f = new File("C:/Users/abc/Desktop/a.xml");
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        builder = builderFactory.newDocumentBuilder();
        Document xmlDocument = builder.parse(f);
        XPath xPath =  XPathFactory.newInstance().newXPath();
        
        NodeList nodeList = (NodeList) xPath.compile(XPATH).evaluate(xmlDocument, XPathConstants.NODESET);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        
        String jsonOutput = gson.toJson(nodeList);
        System.out.println(jsonOutput);
        
        
        
        
    }

}
但是我犯了个错误

线程“main”java.lang.StackOverflower中的异常位于

append(StringBuffer.java:224)位于

write(StringWriter.java:84)位于

com.google.gson.stream.JsonWriter.newline(JsonWriter.java:569)位于

com.google.gson.stream.JsonWriter.beforeName(JsonWriter.java:586)

如何修复此代码

因为可以将整个xml转换为json()


我假设可以将dom节点转换为json。这里怎么了?

怎么了?您只是不使用链接()中描述的库

Gson将使用java反射从任何对象生成json字符串。从DOM文档(或节点)中,即使它没有以StackOverflowerError结束,也不会产生您期望的结果。以下是XML的结果:

{"fNamespacesEnabled":false,"mutationEvents":false,"actualEncoding":"UTF-8","standalone":false,"fDocumentURI":"...a.xml","changes":0,"allowGrammarAccess":false,"errorChecking":true,"ancestorChecking":true,"xmlVersionChanged":false,"documentNumber":0,"nodeCounter":0,"xml11Version":false,"flags":6}
实际上,如果在DOM文档上调用了任何方法(例如:
getDocumentElement
),则
gson.toJson
将以StackOverflower错误结束

正如您在链接中所看到的,可以在这里找到一个执行此任务的jar:

这意味着您将使用XPath提取的节点重新转换为字符串。 你可以这样做:

private static String toString(Node n) throws TransformerFactoryConfigurationError, TransformerException {
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    StreamResult result = new StreamResult(new StringWriter());
    DOMSource source = new DOMSource(n);
    transformer.transform(source, result);
    return result.getWriter().toString();
}
有了这些,您所要做的就是循环遍历节点列表,将其转换为字符串,然后将其转换为json

for (int i = 0; i < nodeList.getLength(); i++) {
    Node n = nodeList.item(i);
    JSONObject xmlJSONObj = XML.toJSONObject(toString(n));
    String jsonPrettyPrintString = xmlJSONObj.toString(1);
    System.out.println(jsonPrettyPrintString);
}
for(int i=0;i