Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取为数字代码,而不是特殊字符_Java_Xml_Database_Sax - Fatal编程技术网

Java 读取为数字代码,而不是特殊字符

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

我有一个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 = 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&uuml;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&uuml;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()
已成为。的可能重复项