linhx 2011-08-14 23:03
浏览 220
已采纳

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

XML文件大概如下,通过DOM去解析,但是如果元素中含有中文,则无法整体返回字符串,只能返回一个第一个中文,如“蒙”:

XML文件一:
[code="java"]

Source Milk Title
2011-05-30T12:47:58Z
1
Milk
Milk Title
2011-08-14T12:23:16Z


蒙牛的好喝酸奶
2011-06-06T12:52:21Z
2
蒙牛酸奶
蒙牛的好喝酸奶
2011-06-06T12:52:21Z

[/code]

具体相关代码如下:
代码一:
[code="java"] 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(); 
    }

[/code]

代码二:
[code="java"]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
}[/code]

通过代码二分析,发现中文字符串在此处并没有被看成一个完整的节点,而是多个node,比如对:蒙牛的好喝酸奶 解析, getFirstChild()返回的是第一个字符“蒙”, etLastChild()返回的是最后一个字符“奶”。
问题出现在什么地方呢? 求解答?

另外,通过debug,发现传进去的不是初始的XML文件一,而是类似如下含有对应中文编码字符。或许与此有关,但是不知其然?

XML文件二:
<?xml version="1.0" encoding="UTF-8"?>


Source Milk Title
2011-05-30T12:47:58Z
1
Milk
Milk Title
2011-08-14T12:23:16Z


蒙牛的好喝酸奶
2011-06-06T12:52:21Z
2
蒙牛酸奶
蒙牛的好喝酸奶
2011-06-06T12:52:21Z

  • 写回答

1条回答 默认 最新

  • myali88 2011-08-15 12:55
    关注

    [quote][code="java"]
    InputSource is = new InputSource();

    is.setCharacterStream(new StringReader(xmlString));

    Document doc = db.parse(is);

    [/code][/quote]
    不知道你这里的“xmlString”是怎么样获取的,我以直接在声明变量的方式读写的话,没有出现你说的问题。
    另外我也采用了另外两种方式:
    [code="java"]
    is.setByteStream(Dom4ChineseParser.class.getResourceAsStream("test.xml"));
    [/code]

    [code="java"]
    is.setCharacterStream(new InputStreamReader(Dom4ChineseParser.class.getResourceAsStream("test.xml") , "UTF-8"));
    [/code]
    都没有发现你说的问题。

    [quote]另外,通过debug,发现传进去的不是初始的XML文件一,而是类似如下含有对应中文编码字符。或许与此有关,但是不知其然? [/quote]
    这里看到的xml应该是按
    [code="java"]<?xml version="1.0" encoding="UTF-8"?> [/code]
    编码后的结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵