无法解析包含特殊字符的值?使用sax解析器

时间:2014-01-29 11:47:00

标签: java parsing sax

我是解析字段的新手。我正在尝试编写解析器代码但无法获取值包含ampersand(&)的特定标记的值。请帮我解决问题。

我的xml文件看起来像

<system>
<u_id>10145</u_id>
<serial_no>1800015</serial_no>
<branch_name>B & P Infotech Ltd.</branch_name>
</system>

我试过这个java代码,但它没有给我正确的输出。

主要课程

package com.satya.xmltest;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxTest {

    public static void main(String[] args) {
        SAXParserFactory parserFactory = SAXParserFactory.newInstance();
        SaxtestHandler handler=new SaxtestHandler();
        try {
            SAXParser parser = parserFactory.newSAXParser();
            parser.parse("C:\\Users\\abc\\Desktop\\test.xml", handler);
        } catch (Exception e) {
        }
        SystemTo systemTo=handler.systemTo;
        System.out.println("Uid :"+systemTo.getUid());
        System.out.println("serial number :"+systemTo.getSerialNumber());
        System.out.println("name :"+systemTo.getName());
    }
}

处理程序类

在此类中,完成解析并将数据值设置为数据容器类。

package com.satya.xmltest;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxtestHandler extends DefaultHandler {
    String content = "";
    SystemTo systemTo=new SystemTo();

    @Override
    public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {

        switch (qName) {
            case "system":
                System.out.println("inside company");
                break;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
        throws SAXException {
        switch (qName) {
            case "u_id":
                systemTo.setUid(content);
                break;
            case "serial_no":
                systemTo.setSerialNumber(content);
                break;
            case "branch_name":
                systemTo.setName(content);
                break;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
        throws SAXException {
        content = String.copyValueOf(ch, start, length).trim();
    }
}

数据容器类

package com.satya.xmltest;

public class SystemTo {

    private String uid;
    private String serialNumber;
    private String name;
    public String getUid() {
        return uid;
    }
    public void setUid(String uid) {
        this.uid = uid;
    }
    public String getSerialNumber() {
        return serialNumber;
    }
    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

我的输出是:

Uid: 10145
serial number: 1800015
name: null

但我需要:

Uid: 10145
serial number: 1800015
name: B & P Infotech Ltd.

提前致谢。

4 个答案:

答案 0 :(得分:5)

XML中的某些字符不能以XML文档的文字形式出现,除非用作标记分隔符或在注释,处理指令或CDATA部分中使用。
List of characters及其对应的实体或要替换的数字引用:

Original Character    XML entity replacement      XML numeric replacement

      "                     &quot;                       &#34;   
      <                     &lt;                         &#60;   
      >                     &gt;                         &#62;
      &                     &amp;                        &#38;
      '                     &apos;                       &#39;   

在解析之前,必须在XML中替换上面的字符。

您可以将CDATA Section用于非标记的文本构成文档的字符数据

答案 1 :(得分:3)

你可以像html那样逃避这些角色:

<branch_name>B &amp; P Infotech Ltd.</branch_name>

或者你使用了CDATA:

<branch_name><![CDATA[B & P Infotech Ltd.]]></branch_name>

答案 2 :(得分:0)

您必须使用XML文件接受的字符替换您的特殊字符。在你的情况下&amp;应该用&amp; amp;

代替
@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    content = String.copyValueOf(ch, start, length).trim();
    content = content.replace("&", "&amp;")
}

答案 3 :(得分:0)

问题在于“&amp;”是一个逃脱的角色。

要解决此问题,您需要用等效的unicode替换&符号,即:“&#038;