1. 程式人生 > >把Json轉Xml並且用xpath讀取xml元素(JAVA)

把Json轉Xml並且用xpath讀取xml元素(JAVA)

maven

<dependency>  
    <groupId>net.sf.json-lib</groupId>  
    <artifactId>json-lib</artifactId>  
    <version>2.4</version>  
    <classifier>jdk15</classifier>  
</dependency>  
<dependency>
    <groupId>xom</groupId>
    <artifactId
>
xom</artifactId> <version>1.2.5</version> </dependency>

操作程式碼

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml
.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.dom4j.DocumentException; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import net.sf
.json.JSONObject; import net.sf.json.xml.XMLSerializer; public class Test { public static String json2Xml(String json) { try { JSONObject jo = JSONObject.fromObject(json); XMLSerializer serializer = new XMLSerializer(); return serializer.write(jo); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) throws FileNotFoundException, SAXException, IOException, ParserConfigurationException, DocumentException, XPathExpressionException { String str = "{\"avg\":\"432432\",\"interview\":{\"m\":{\"uv\":321321,\"pv\":432432}}}"; str = json2Xml(str); System.out.println(str); DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(new InputSource(new StringReader(str))); XPath xpath = XPathFactory.newInstance().newXPath(); System.out.println((String) xpath.evaluate("/o/interview/m/uv", document)); } }

注意事項:

由於平時我們命名的json的key名稱有可能為數字開頭的,例如
{"1h":31}
而xml規則中則不允許出現數字開頭
如<123a>這樣的標籤是不合法的
所以一旦json字串中出現以上的不合法命名則出現以下出錯
nu.xom.IllegalNameException: NCNames cannot start with the character 31
    at nu.xom.Verifier.throwIllegalNameException(Unknown Source)
    at nu.xom.Verifier.checkNCName(Unknown Source)
    at nu.xom.Element._setLocalName(Unknown Source)
    at nu.xom.Element.<init>(Unknown Source)
    at nu.xom.Element.<init>(Unknown Source)