通过Java DOM解析 XML时碰到中文无法整体返回,只能返回一个第一个中文

问题描述

XML文件大概如下,通过DOM去解析,但是如果元素中含有中文,则无法整体返回字符串,只能返回一个第一个中文,如“蒙”: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"?> 编码后的结果。

时间: 2024-09-17 04:39:02

通过Java DOM解析 XML时碰到中文无法整体返回,只能返回一个第一个中文的相关文章

java dom-关于Java Dom 解析XML后,在TableTreeView下的修改问题

问题描述 关于Java Dom 解析XML后,在TableTreeView下的修改问题 最近在看Java解析XML的相关资料,在尝试用DOM解析时,出现一些小问题. 用DOM解析XML后,在TableTreeView里显示,然后调用了 ViewerColumn 中的 setEditingSupport() 方法,对XML标签间 TextContent 进行修改,但是在判断能否修改时产生了一些问题,不知道如何在 canEdit() 中进行判断,要求只对标签的TextContent进行编辑. pro

java DOM 解析XML

问题描述 javaDOM解析XML时,如果XML包含<!DOCTYPEcoveritySYSTEM"config.dtd">就会出错,报错的是无法找到"config.dtd",解析XML时该怎么避免此错误?

Android使用Dom解析xml文件并进行展示

本程序实现了使用Dom方法从网络端解析xml文件,展示在列表,并实现点击进入相关页面. 首先我们创建一个类,用来实现http请求和xml文件节点的获取,这里的http请求很简单,就传递一 个url,在代码中通过这样的一个方法实现 public String getXmlFromUrl(String url) { String xml = null; try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpC

java 解析xml文件-在JAVA中解析XML文件时遇上难题,向各位大虾求助。

问题描述 在JAVA中解析XML文件时遇上难题,向各位大虾求助. 在服务器进程中编写登录时出现以下错误提示: Exception in thread "Thread-0" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl cannot be cast to javax.swing.text.Document at server.ServerThread.Lo

java中用dom解析xml的经典入门级文档

dom|xml 一.前言 用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM.Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器.JAXP接口包含了三个包:(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型

JSP基于dom解析xml实例详解_JSP编程

本文实例讲述了JSP基于dom解析xml的方法.分享给大家供大家参考,具体如下: 初次学习用dom操作xml文件,有很多不足之处,牛人多给点建议,练习时我没对中文做乱码处理,也没做验证哦!O(∩_∩)O~ 实体类:User public class User { private String name; private String pwd; private String email; public String getName() { return name; } public void se

java-当解析 XML 时出现的错误

问题描述 当解析 XML 时出现的错误 在应用程序打开之前 XMLParser 就崩溃了.错误是: org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) XMLParser 代码: public class XMLParser { public XMLParser(){ } public String getXmlFrom

java-求助SAX解析XML时为什么不加上stack.pop()无法打印出元素文本内容?

问题描述 求助SAX解析XML时为什么不加上stack.pop()无法打印出元素文本内容? package com.shengsiyuan.xml.sax; import java.io.File; import java.util.Stack; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.s

Android开发之DOM解析xml文件的方法_Android

本文实例讲述了Android中DOM解析xml文件的方法.分享给大家供大家参考,具体如下: 一.在assets文件中写xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>李明</name> <age>30</age> </person> <pe