我阅读了一些关于XML解析器的文章,并且遇到了SAX和DOM.
SAX是基于事件的,DOM是树模型 - 我不理解这些概念之间的差异.
根据我的理解,基于事件意味着某种事件发生在节点上.就像当单击特定节点时,它将给出所有子节点,而不是同时加载所有节点.但是在DOM解析的情况下,它将加载所有节点并创建树模型.
我的理解是否正确?
请纠正我如果我错了或以更简单的方式向我解释基于事件和树模型.
我正在使用groovy的logback并在解析xml时出现很多警告.我知道JDK1.7_u45中导致此问题的错误.
Warning: org.apache.xerces.parsers.SAXParser: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
Warning: org.apache.xerces.parsers.SAXParser: Property 'http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit' is not recognized.
Run Code Online (Sandbox Code Playgroud)
有没有办法关闭这个日志警告出现在DEBUG?我尝试使用Filter编写过滤器,但没有帮助.
在推送解析方法下,推送解析器在解析文档时生成同步事件,并且应用程序可以使用回调处理程序模型处理这些事件
这是关于SAX 2.0的Pro XML Development with Java一书中给出的文本.
至于StAX,这本书说:
在pull方法下,使用解析器在应用程序的控制下从XML文档中提取事件.
我想问一下,突出显示文本的含义是什么?一个适合初学者的答案表示赞赏:)
我理解SAX解析器的工作方式与XMLPull解析器之间的区别.事实上这里有一个很好的解释:
http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm 这篇文章有点以.NET为中心,但概念适用.
虽然我同意作者的观点,即Pull解析器更容易使用,但我很困惑哪种类型的解析器在哪种情况下会更好.如果有人可以放弃任何光线并指出我更多的阅读,我会很感激.
谢谢.
我必须在Android上阅读大约约4000行的XML文件.首先,我尝试使用SimpleXML库,因为它最简单,我的HTC Desire花了大约2分钟.所以我想也许SimpleXML因为反射和这个库使用的所有其他魔法而变得如此之慢.我重写了我的解析器并使用了内置的DOM解析方法,并对性能有一些特别的关注.这有点帮助,但它仍然需要大约60秒,这仍然是完全不可接受的.经过一番研究后,我在developer.com上发现了这篇文章.有一些图表显示其他两种可用方法 - SAX解析器和Android的XML Pull-Parser - 同样很慢.在文章的最后,您将找到以下声明:
我遇到的第一个惊喜是这三种方法的速度有多慢.用户不希望在移动电话上等待很长时间,因此解析超过几十条记录的任何内容都可能需要采用不同的方法.
什么可能是"不同的方法"?如果你有超过"几十条记录"怎么办?
HttpURLConnection.getInputStream()给出UnknownLengthHttpInputStream,由于此Document解析引发SAX解析器异常.
以下是代码
try{
URL url = new URL(uri);
HttpURLConnection connection =
(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");
InputStream xml = connection.getInputStream();
System.out.println(connection.getResponseCode());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(connection.getInputStream());
doc.getDocumentElement().normalize();
}catch(Exception e){
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道UnknownLengthHttpInputStream的原因.我只在android中遇到此错误,此代码在Java Project中完美运行.
以下是LogCat的例外情况:
08-08 11:07:40.490: W/System.err(1493): org.xml.sax.SAXParseException: Unexpected end of document
08-08 11:07:40.504: W/System.err(1493): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:129)
08-08 11:07:40.510: W/System.err(1493): at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
08-08 11:07:40.510: W/System.err(1493): at com.example.testws.MainActivity.onCreate(MainActivity.java:59)
08-08 11:07:40.520: W/System.err(1493): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-08 11:07:40.520: W/System.err(1493): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-08 11:07:40.520: W/System.err(1493): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-08 …Run Code Online (Sandbox Code Playgroud) 当我通过maven运行测试时,我在本地机器上遇到以下异常(mvn test).
ch.qos.logback.core.joran.event.SaxEventRecorder@195ed659 - Parser configuration error occured
java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
Run Code Online (Sandbox Code Playgroud)
在谷歌搜索后,我遇到了几个页面,描述了它背后的主要问题(在不同的类加载器中有几个SAXParserFactoryImpl).
- > http://www.xinotes.org/notes/note/702/
我的问题是,如何确定哪个库也提供SAXParserFactoryImpl,以便我可以排除它.我正在使用Maven,IntelliJ和JDK 1.6.0_23.问题出现在命令行以及从IntelliJ运行测试时.
但奇怪的是,在构建服务器上,这个问题不会发生.
更新1
刚刚想到,当我在mvn clean之后第一次运行mvn测试时,错误没有出现.但是一旦我再次运行mvn test(没有干净,就会发生异常)(当我从IntelliJ运行它时).
当我在cmd行上运行它时,几个mvn测试调用确实有效.
我正在使用Android从Web解析XML.下面的代码显示了XML的示例.我遇到的问题是我无法获取item标签的字符串值.当我使用name = attributes.getQName(i);它时输出名称,而不是属性的值.
<weatherdata>
<timetags>
<item name="date">
<value>20/04/2012</value>
<unit/>
<image/>
<class>dynamic</class>
<description>The current date</description>
</item>
Run Code Online (Sandbox Code Playgroud) 我想知道Android中的XML SAX解析器,Pull解析器和DOM解析器之间的区别.在哪种情况下,哪一个在性能和实施方面更好?
感谢名单.Khobaib.
我有一个简单的要求,我需要获取属性的值,xml:id即af1.我正在使用a SAXParser而这里是我xpath:a/aff/@xml:id的相反我能够获取使用的值xpath:a/aff/@value.
但我无法找回价值,请你帮忙吗?
<?xml version="1.0" encoding="UTF-8" ?>
<a>
<aff xml:id="af1" value="a">
<uAff>
Hello
</uAff>
</aff>
<aff xml:id="corr1">
<uAff>
Hello1
</uAff>
</aff>
</a>
Run Code Online (Sandbox Code Playgroud)
提前致谢.
saxparser ×10
android ×6
java ×6
xml ×6
xml-parsing ×3
domparser ×2
groovy ×1
inputstream ×1
logback ×1
stax ×1
web-services ×1
xerces2-j ×1