在下面的代码示例中,我使用STaX解析器来解析XML。如果我通过它运行xml10,它将按预期工作。xml11字符串(除xml版本外,其他都是相同的)-抛出NullPointerException。我正在使用JDK
1.6的Mac上运行它。
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.util.Stack;
/**
*/
public class StaxSucks {
static String xml10 ="<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"+
"<anElement/>";
static String xml11 ="<?xml version=\"1.1\" encoding=\"utf-8\" ?>\n"+
"<anElement/>";
static void parse(InputStream is) throws Exception{
final XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
final XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(is);
Stack<QName> XMLDEPTH = new Stack<QName>();
int eventType = xmlStreamReader.next();
while(eventType != XMLStreamConstants.END_DOCUMENT){
if(XMLStreamConstants.START_ELEMENT == eventType){
QName eventName = xmlStreamReader.getName();
XMLDEPTH.push(eventName);
}else if(XMLStreamConstants.END_ELEMENT == eventType){
//ends should always match the starts.
QName eventName = xmlStreamReader.getName();
if(XMLDEPTH.peek().equals(eventName)){
XMLDEPTH.pop();
}else{
System.out.println("Hit an end with a non-matching beginning:"+eventName);
}
} else{
System.out.println("Hit event type:"+eventType);
}
eventType = xmlStreamReader.next();
}
System.out.println("Stack is empty:"+XMLDEPTH.empty());
}
public static void main(String[] args) throws Exception{
System.out.println("Starting XML1.0");
InputStream is = new ByteArrayInputStream(xml10.getBytes("utf8"));
parse(is);
System.out.println("Starting XML1.1");
is = new ByteArrayInputStream(xml11.getBytes("utf8"));
parse(is);
}
}
堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.scanStartElement(XML11NSDocumentScannerImpl.java:351)
at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl$NS11ContentDriver.scanRootElementHook(XML11NSDocumentScannerImpl.java:889)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3104)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.next(XML11NSDocumentScannerImpl.java:852)
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:554)
at StaxSucks.parse(StaxSucks.java:46)
at StaxSucks.main(StaxSucks.java:74)
嗨,这是在Sun / Oracle JDK中破坏stax实施的情况,IBM JDK可以正常工作,或者您甚至可以只使用最新的Xerces jar,就可以了。
您可以从以下网址下载xerces
jar:http:
//xerces.apache.org/mirrors.cgi#binary
dims@dims-laptop-520:~/test$ /usr/lib/jvm/java-6-sun/bin/java -cp . StaxSucks
Starting XML1.0
Stack is empty:true
Starting XML1.1
Exception in thread "main" java.lang.NullPointerException
at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.scanStartElement(XML11NSDocumentScannerImpl.java:351)
at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl$NS11ContentDriver.scanRootElementHook(XML11NSDocumentScannerImpl.java:889)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3104)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XML11NSDocumentScannerImpl.next(XML11NSDocumentScannerImpl.java:852)
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:554)
at StaxSucks.parse(StaxSucks.java:26)
at StaxSucks.main(StaxSucks.java:54)
dims@dims-laptop-520:~/test$ java -cp .:xercesImpl.jar:xml-apis.jar StaxSucks
Starting XML1.0
Stack is empty:true
Starting XML1.1
Stack is empty:true
问题内容: 对于Java的处理方式以及涉及到的数字和其他类型的数字,我有些困惑。例如: 输出(也许您应该先猜测一下): 这不能编译是可以预料的,是不同的对象。 令我有些惊讶的是,默认情况下9是an ,并且1)甚至没有编译。请注意,您不能将放入期望使用的方法中,但是在这里它们是相等的。 由于两个相同的原因,这令人惊讶,但似乎更糟。 不足为奇,因为自动装箱到和。 不足为奇,因为不同类中的对象不应该是。
如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()没有超出范围?
我试图理解背后的动机。如果已经存在类型类和,为什么有必要呢? 诚然,的实例是具体的类型,而的实例需要一个类型参数。(有关有用的解释,请参见Monoid vs MonadPlus。)但是你不能重写任何类型的约束吗 作为和的组合? 从。它的实施是: 我只能使用和实现它: 有人能澄清和之间的真正区别吗?
GET to工作得很好。 我查阅了111代码,文档中唯一引用它的东西似乎不适用。 下面是不起作用的代码:
当我只运行预处理器时,输出文件包含20。 然而,据我所知,预处理器只是进行文本替换。所以这就是我认为正在发生的事情(这显然是错误的,但idky): NUM被定义为10 所以我认为输出应该是10而不是20。有什么能解释出哪里出了问题吗?
问题内容: 在Go中,有可能等同于或取决于系统架构的类型。我可以声明一个整数变量而不必担心它的大小: 为什么没有type ,它等于或取决于我的系统的体系结构?我希望我也可以: 问题答案: float已在版本2011/01/20中删除。 您仍然可以使用简短的变量声明: 但正如GO常见问题解答所述: 出于可移植性的原因,我们决定以代码中的一些显式转换为代价,使事情变得清晰明了。 您可以在以下主题中查看