我是解析字段的新手。我正在尝试编写解析器代码但无法获取值包含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.
提前致谢。
答案 0 :(得分:5)
XML中的某些字符不能以XML文档的文字形式出现,除非用作标记分隔符或在注释,处理指令或CDATA部分中使用。
List of characters及其对应的实体或要替换的数字引用:
Original Character XML entity replacement XML numeric replacement
" " "
< < <
> > >
& & &
' ' '
在解析之前,必须在XML中替换上面的字符。
您可以将CDATA Section用于非标记的文本构成文档的字符数据
答案 1 :(得分:3)
你可以像html那样逃避这些角色:
<branch_name>B & 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("&", "&")
}
答案 3 :(得分:0)
问题在于“&amp;”是一个逃脱的角色。
要解决此问题,您需要用等效的unicode替换&符号,即:“&
”