Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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 SAXParser解析dtd验证的XML文档时?_Java_Xml_Sax_Dtd - Fatal编程技术网

如何解决;问号;当通过Java SAXParser解析dtd验证的XML文档时?

如何解决;问号;当通过Java SAXParser解析dtd验证的XML文档时?,java,xml,sax,dtd,Java,Xml,Sax,Dtd,我想知道为什么我的SaxParser似乎无法解析外部dtd文件中定义的某些实体。我正在处理一个巨大的xml文件,它的头如下。因此,输入是(大幅减少:-): 明显地á未解析 以下是我如何设置解析器的: // MySaxParser.java public class MySaxParser extends DefaultHandler { @Override public void characters(char[] ch, int start, int length)

我想知道为什么我的
SaxParser
似乎无法解析外部dtd文件中定义的某些实体。我正在处理一个巨大的xml文件,它的头如下。因此,输入是(大幅减少:-):

明显地
á未解析

以下是我如何设置解析器的:

// MySaxParser.java

public class MySaxParser extends DefaultHandler {

@Override
public void characters(char[] ch, int start, int length)
        throws SAXException {
    if ("author".equals(currentTag)) {
        System.out.println(String.valueOf(Arrays.copyOfRange(ch, start, start + length)));
    }
}

static public void main(String[] args) throws Exception {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, false);
    spf.setNamespaceAware(true);
    spf.setValidating(true); // From what I understood from the API this combined
                             // with '<!DOCTYPE mydtd SYSTEM "mydtd.dtd">' from
                             // the file myxml.xml should do the trick. What do I miss?

    SAXParser saxParser = spf.newSAXParser();
    XMLReader xmlReader = saxParser.getXMLReader();
    xmlReader.setContentHandler(new SAXLocalNameCount());
    xmlReader.setErrorHandler(new MyErrorHandler(System.err));

    xmlReader.parse("file:/path/to/myxml.xml");
}
}
控制台输出为:

B - 11
a - 10
l - 21
? - -1
z - 35
s - 28
-1表示在事件
字符
被触发之前发生了错误,不是吗

我的错误处理程序:

package com.hw;

import java.io.PrintStream;

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

class MyErrorHandler implements ErrorHandler {
    private PrintStream out;

    MyErrorHandler(PrintStream out) {
        this.out = out;
    }

    private String getParseExceptionInfo(SAXParseException spe) {
        String systemId = spe.getSystemId();

        if (systemId == null) {
            systemId = "null";
        }

        String info = "URI=" + systemId + " Line=" + spe.getLineNumber() + ": "
                + spe.getMessage();

        return info;
    }

    public void warning(SAXParseException spe) throws SAXException {
        out.println("Warning: " + getParseExceptionInfo(spe));
    }

    public void error(SAXParseException spe) throws SAXException {
        String message = "Error: " + getParseExceptionInfo(spe);
        throw new SAXException(message);
    }

    public void fatalError(SAXParseException spe) throws SAXException {
        String message = "Fatal Error: " + getParseExceptionInfo(spe);
        throw new SAXException(message);
    }

}

您肯定有输出编码的问题,即控制台或接收您的输出的任何东西无法正确处理UTF-16(这是本机java编码)

而且,您还被
Characters#getNumericValue()
方法欺骗,认为您有输入或解析器编码问题。
getNumericValue()
尝试将字符解释为表示数字的内容,而不是实际的代码点值或任何类似的内容。如文件所述,如果你给罗马数字50,Ⅼ (U+216C),该方法将打印
50

尝试替换该行:

System.out.println(ch[i] + " - " + Character.getNumericValue(ch[i]));
        System.out.println(ch[i] + " - " + Character.getNumericValue(ch[i]));

你可能会看到它打印出来

? - e1
现在,如何解决输出编码问题:除非您提供更多详细信息,否则我无法帮助您

更新

您可以在中设置eclipse控制台编码

Run Configurations --> Common
或者在JDK/JRE中使用

-Dfile.encoding

属性(此属性不是100%确定)。

@IanRoberts中的元素名称(这里是
dtd
),是的,我键入了错误,将立即修复。你确定这不是编码问题吗?我认为@Hannes是正确的,你应该再检查一次sysout。”?“看起来像是编码器的替换字符,因此,我认为实体实际上已解析,但无法在编码中表示。为什么不打印字符的int值而不是字符串呢?你是对的,我做了建议的更改,得到了你所期望的结果。您需要知道什么来帮助我解决输出编码问题?这是我认为可能相关的第一批信息。我假设
char
数组
ch
包含
中编码的字符“ISO-8859-1”
,对吗?我目前在Mac上使用EclipseIndigo。A
System.out.println(“默认编码=”+System.getProperty(“file.Encoding”))
US-ASCII
。char[]没有不同的编码(它总是UTF16)。
System.out.println(ch[i] + " - " + Integer.toHexString((int) ch[i]));
? - e1
Run Configurations --> Common
-Dfile.encoding