相关文章
更多最近更新
更多通过Java DOM解析 XML时碰到中文无法整体返回,只能返回一个第一个中文
2019-03-25 13:33|来源: 网路
XML文件大概如下,通过DOM去解析,但是如果元素中含有中文,则无法整体返回字符串,只能返回一个第一个中文,如“蒙”:
XML文件一:
具体相关代码如下:
代码一:
代码二:
通过代码二分析,发现中文字符串在此处并没有被看成一个完整的节点,而是多个node,比如对:<content>蒙牛的好喝酸奶 </content>解析, getFirstChild()返回的是第一个字符“蒙”, etLastChild()返回的是最后一个字符“奶”。
问题出现在什么地方呢? 求解答?
另外,通过debug,发现传进去的不是初始的XML文件一,而是类似如下含有对应中文编码字符。或许与此有关,但是不知其然?
XML文件二:
<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
<post>
<content>Source Milk Title</content>
<created-at type="datetime">2011-05-30T12:47:58Z</created-at>
<id type="integer">1</id>
<name>Milk</name>
<title>Milk Title</title>
<updated-at type="datetime">2011-08-14T12:23:16Z</updated-at>
</post>
<post>
<content>蒙牛的好喝酸奶 </content>
<created-at type="datetime">2011-06-06T12:52:21Z</created-at>
<id type="integer">2</id>
<name>蒙牛酸奶</name>
<title>蒙牛的好喝酸奶 </title>
<updated-at type="datetime">2011-06-06T12:52:21Z</updated-at>
</post>
</posts>
问题补充:
不知道你这里的“xmlString”是怎么样获取的,我以直接在声明变量的方式读写的话,没有出现你说的问题。
另外我也采用了另外两种方式:
和
都没有发现你说的问题。
这里看到的xml应该是按
编码后的结果。
谢谢,改天我再试试!
XML文件一:
<posts type="array"> <post> <content>Source Milk Title</content> <created-at type="datetime">2011-05-30T12:47:58Z</created-at> <id type="integer">1</id> <name>Milk</name> <title>Milk Title</title> <updated-at type="datetime">2011-08-14T12:23:16Z</updated-at> </post> <post> <content>蒙牛的好喝酸奶 </content> <created-at type="datetime">2011-06-06T12:52:21Z</created-at> <id type="integer">2</id> <name>蒙牛酸奶</name> <title>蒙牛的好喝酸奶 </title> <updated-at type="datetime">2011-06-06T12:52:21Z</updated-at> </post> </posts>
具体相关代码如下:
代码一:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xmlString)); Document doc = db.parse(is); NodeList nodes = doc.getElementsByTagName("post"); eventsArrayList = new ArrayList<myEvents>(); //Gertig //Iterate the events for (int i = 0; i < nodes.getLength(); i++) { Element element = (Element) nodes.item(i); eventsArrayList.add(new myEvents()); NodeList eventIDNum = element.getElementsByTagName("id"); Element line = (Element) eventIDNum.item(0); eventsArrayList.get(i).eventID = Integer.parseInt(getCharacterDataFromElement(line)); NodeList eventName = element.getElementsByTagName("name"); line = (Element) eventName.item(0); eventsArrayList.get(i).name = getCharacterDataFromElement(line).trim(); // String reName = getCharacterDataFromElement(line); // String reTrimName = getCharacterDataFromElement(line).trim(); // NodeList eventBudget = element.getElementsByTagName("content"); // line = (Element) eventBudget.item(0); // eventsArrayList.get(i).budget = Double.parseDouble(getCharacterDataFromElement(line)); NodeList eventContent = element.getElementsByTagName("content"); line = (Element) eventContent.item(0); eventsArrayList.get(i).content = getCharacterDataFromElement(line).trim(); }
代码二:
public static String getCharacterDataFromElement(Element e) { Node child = e.getFirstChild(); Node lchild = e.getLastChild(); if (child instanceof CharacterData) { CharacterData cd = (CharacterData) child; CharacterData lcd = (CharacterData) lchild; String cdStr = cd.getNodeValue(); String lcdStr = lcd.getNodeValue(); return cd.getData(); } return "?"; //ListActivity will display a ? if a null value is passed to the Rails server }
通过代码二分析,发现中文字符串在此处并没有被看成一个完整的节点,而是多个node,比如对:<content>蒙牛的好喝酸奶 </content>解析, getFirstChild()返回的是第一个字符“蒙”, etLastChild()返回的是最后一个字符“奶”。
问题出现在什么地方呢? 求解答?
另外,通过debug,发现传进去的不是初始的XML文件一,而是类似如下含有对应中文编码字符。或许与此有关,但是不知其然?
XML文件二:
<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
<post>
<content>Source Milk Title</content>
<created-at type="datetime">2011-05-30T12:47:58Z</created-at>
<id type="integer">1</id>
<name>Milk</name>
<title>Milk Title</title>
<updated-at type="datetime">2011-08-14T12:23:16Z</updated-at>
</post>
<post>
<content>蒙牛的好喝酸奶 </content>
<created-at type="datetime">2011-06-06T12:52:21Z</created-at>
<id type="integer">2</id>
<name>蒙牛酸奶</name>
<title>蒙牛的好喝酸奶 </title>
<updated-at type="datetime">2011-06-06T12:52:21Z</updated-at>
</post>
</posts>
问题补充:
myali88 写道
引用
InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xmlString)); Document doc = db.parse(is);
不知道你这里的“xmlString”是怎么样获取的,我以直接在声明变量的方式读写的话,没有出现你说的问题。
另外我也采用了另外两种方式:
is.setByteStream(Dom4ChineseParser.class.getResourceAsStream("test.xml"));
和
is.setCharacterStream(new InputStreamReader(Dom4ChineseParser.class.getResourceAsStream("test.xml") , "UTF-8"));
都没有发现你说的问题。
引用
另外,通过debug,发现传进去的不是初始的XML文件一,而是类似如下含有对应中文编码字符。或许与此有关,但是不知其然?
这里看到的xml应该是按
<?xml version="1.0" encoding="UTF-8"?>
编码后的结果。
谢谢,改天我再试试!
相关问答
更多-
java中dom解析xml看不懂怎么办[2022-11-02]
前3步的工厂、生产解析器什么的 不用很懂 记得这么做就行 后面的那些各种方法你就只能去看视频和查API学习了 简单的dom解析没有用到别的东西了 就是几个类的方法而已 NodeList Node Element 大部分就是靠这三类的方法解决的 去查API吧 -
Java Dom解析XML[2022-03-31]
public static void main(String[] args) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse("D:/test.xml"); //存放该xml文件的路径; NodeList employees = document.getCh ... -
java dom 解析xml[2023-07-04]
db = dbf.newDocumentBuilder(); Document doc = db.parse("1.xml"); NodeList l = doc.getElementsByTagName("数据组").item(0).getChildNodes(); for (int i = 0; i < l.getLength(); i++) { Node n = l.item(i); if (n.getNodeType() != Node.TEXT_NODE) System.out.println(n ... -
JAVA~eclipse~DOM解析XML[2023-11-08]
jdom.jar SAXBuilder builder=new SAXBuilder(false); Document document=builder.build(path);//从文档路径path加载xml文件 Element books= document.getRootElement();//获取books根元素 Listl = books.getChildren("book");//获取books元素下的所有book子元素集 //遍历l Element author = nul ... -
Java - 使用DOM解析xml(Java - Parsing xml using DOM)[2022-07-12]
如果你想使用DOM,我建议你首先编写一些帮助类来使你的工作更轻松。 这是我最近写的一个供个人使用的。 让我们从包xml.utils中的帮助程序类开始 XmlException.java package xml.utils; public class XmlException extends Exception { private static final long serialVersionUID = 1L; public XmlException(String message, Thr ... -
解析java中的dom错误(Parsing dom error in java)[2022-11-25]
它应该是这样的: - private void parseXmlFile(){ //get the factory DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { //using Factory get an instance of document builder DocumentBuilder db = dbf.newDocumentB ... -
使用java DOM解析XML(Parsing XML using java DOM)[2022-10-30]
问题是Node server = getNodes("server",root); 返回null。 为什么会这样? 那你看看你是如何实现getNodes的 Node getNodes(String tagName, NodeList nodes) { for(int i=0; i< nodes.getLength();i++) { Node node= nodes.item(i); if(node.getNodeName().equalsIgnoreCase(tagN ...