Java 读取为数字代码,而不是特殊字符
我有一个XML文件,由SAX解析器读取,存储到CSV中并导入数据库 在我的XML文件中,有一位作者的名字是:Java 读取为数字代码,而不是特殊字符,java,xml,database,sax,Java,Xml,Database,Sax,我有一个XML文件,由SAX解析器读取,存储到CSV中并导入数据库 在我的XML文件中,有一位作者的名字是:Gü;海涅曼先生 如您所见,XML中的“ü”写为&umml line = line.replace("&", "&"); // Undo XML escapes: String[] xmlTags = { "amp", "lt", "gt", "quot", "apos" }; for (String xmlTag : xmlTags) { line
Gü;海涅曼先生
如您所见,XML中的“ü”写为&umml代码>
line = line.replace("&", "&");
// Undo XML escapes:
String[] xmlTags = { "amp", "lt", "gt", "quot", "apos" };
for (String xmlTag : xmlTags) {
line = line.replace("&" + xmlTag + ";", "&" + xmlTag + ";");
}
因此,是的,我需要将作者存储在数据库中。我不能把那个字符存储为“ü”。我需要将其存储为&umml代码>
但是,当我使用SAX解析器读取XML时,它一直以“ü”的形式读取,而不是&umml代码>
如何将Java存储为&umml代码>而不是“ü”
谢谢它可能也很慢,因为可能读取了一个包含include的巨大HTML DTD。
但是,您需要将其作为单个符号,不允许使用AND(&
)。HTMLDTD定义了数百个HTML实体名称,如&perc代码>(%
)
DTD可以取自XML目录,即该HTML URL的脱机本地版本。然后可以更改实体。但这是太多的工作
我们可以做的是在解析器中安装自己的EntityHandler,以此类推。研究工作,相对容易
最简单的方法是将输入包装在您自己的InputStream/读取器中,例如用替换&
&代码>,这将进行所需的替换
在XML中:&;uuml代码>而不是ü代码>
line = line.replace("&", "&");
// Undo XML escapes:
String[] xmlTags = { "amp", "lt", "gt", "quot", "apos" };
for (String xmlTag : xmlTags) {
line = line.replace("&" + xmlTag + ";", "&" + xmlTag + ";");
}
使用的实用方法和
您可以使用下面代码的修改版本来捕获实体的开始和结束。由于解析器必须获取所有HTMLLatin1实体的声明,因此执行需要几秒钟。当您得到一个不是以%
开头的实体时,您可以在acc
缓冲区中替换插入的字符。注意预定义的实体,如&代码>
您还可以使用Sax过滤器自动执行作业。美国联邦法规。答复我可能会更新我的答案以提供完整的解决方案
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;
import org.xml.sax.ext.DefaultHandler2;
class MyHandler extends DefaultHandler2 {
private StringBuilder acc;
public MyHandler() {
acc = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.printf("startElement. uri:%s, localName:%s, qName:%s\n", uri, localName, qName);
acc.setLength(0);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.printf("endElement. uri:%s, localName:%s, qName:%s\n", uri, localName, qName);
System.out.printf("Characters accumulated: %s\n", acc.toString());
acc.setLength(0);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
acc.append(ch, start, length);
System.out.printf("characters. [%s]\n", new String(ch, start, length));
}
@Override
public void startEntity(java.lang.String name)
throws SAXException {
System.out.printf("startEntity: %s\n", name);
}
@Override
public void endEntity(java.lang.String name)
throws SAXException {
System.out.printf("endEntity: %s\n", name);
}
}
public class SAXTest1 {
public static void main(String args[]) throws SAXException, ParserConfigurationException, UnsupportedEncodingException {
String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE author [\n< !ELEMENT author (#PCDATA)>\n<!ENTITY % HTMLlat1 PUBLIC \"-//W3C//ENTITIES Latin 1 for XHTML//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent\"> \n%HTMLlat1;\n]>\n<author>Günther Heinemann</author>";
System.out.println(s);
InputStream stream = new ByteArrayInputStream(s.getBytes("UTF-8"));
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
DefaultHandler2 handler = new MyHandler();
xmlReader.setContentHandler(handler);
xmlReader.setProperty(
"http://xml.org/sax/properties/lexical-handler",
handler);
try {
xmlReader.parse(new InputSource(stream));
} catch (IOException e) {
System.err.println("I/O error: " + e.getMessage());
} catch (SAXException e) {
System.err.println("Parsing error: " + e.getMessage());
}
}
}
import java.io.ByteArrayInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.UnsupportedEncodingException;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.parsers.SAXParserFactory;
导入org.xml.sax.*;
导入org.xml.sax.ext.DefaultHandler2;
类MyHandler扩展了DefaultHandler2{
私人建筑商协会;
公共MyHandler(){
acc=新的StringBuilder();
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、,
属性(atts)引发SAXException{
System.out.printf(“startElement.uri:%s,localName:%s,qName:%s\n”,uri,localName,qName);
acc.setLength(0);
}
@凌驾
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
System.out.printf(“endElement.uri:%s,localName:%s,qName:%s\n”,uri,localName,qName);
System.out.printf(“累积字符数:%s\n”,根据toString());
acc.setLength(0);
}
@凌驾
公共无效字符(字符[]ch,整数开始,整数长度)
抛出SAX异常{
附件(通道、起点、长度);
System.out.printf(“字符。[%s]\n”,新字符串(ch,start,length));
}
@凌驾
public void startenty(java.lang.String名称)
抛出SAX异常{
System.out.printf(“起始状态:%s\n”,名称);
}
@凌驾
公共void属性(java.lang.String名称)
抛出SAX异常{
System.out.printf(“属性:%s\n”,名称);
}
}
公共类SAXDest1{
公共静态void main(字符串args[])引发SAXException、ParserConfiguration异常、UnsupportedEncodingException{
字符串s=“\n\n\n%htmlata1;\n]>\nGü;nther Heinemann”;
系统输出打印项次;
InputStream=新的ByteArrayInputStream(s.getBytes(“UTF-8”);
SAXParserFactory=SAXParserFactory.newInstance();
工厂设置验证(true);
XMLReader=factory.newSAXParser().getXMLReader();
DefaultHandler2 handler=新的MyHandler();
setContentHandler(handler);
xmlReader.setProperty(
"http://xml.org/sax/properties/lexical-handler",
经办人);
试一试{
parse(新输入源(流));
}捕获(IOE异常){
System.err.println(“I/O错误:+e.getMessage());
}捕获(SAXE异常){
System.err.println(“解析错误:+e.getMessage());
}
}
}
程序执行:
$ java SAXTest1
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE author [
<!ELEMENT author (#PCDATA)>
<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml-lat1.ent">
%HTMLlat1;
]>
<author>Günther Heinemann</author>
startEntity: %HTMLlat1
endEntity: %HTMLlat1
startElement. uri:, localName:, qName:author
characters. [G]
startEntity: uuml
endEntity: uuml
characters. [ünther Heinemann]
endElement. uri:, localName:, qName:author
Characters accumulated: Günther Heinemann
$java SAXTest1
%HTMLAT1;
]>
Gü;海涅曼
起始日期:%1
亲密度:%1
startElement。uri:,localName:,qName:作者
人物。[G]
起始性:uuml
亲和力:uuml
人物。[ünther Heinemann]
可爱。uri:,localName:,qName:作者
累积字符:Günther Heinemann
unescapeXml()
是否做了与OP要求相反的事情?我会尝试。实际上我自己没有尝试过这些,但根据文档,escapeXml()
和unescapeXml()
只支持五个内置XML实体。为了将u
转换为ü代码>,似乎您必须使用escapeHtml()
。还有一件事:在Apache Commons Lang的最新版本(3.1)中,我注意到API中有一些更改。例如,escapeHtml()
已成为。的可能重复项