Tag: sax

Java:解析XML文件:DOM,SAX还是StAX?

我正在使用Apache Tomcat开发RSS feed聚合器。 我想知道使用哪个解析器来读取RSS源。 我应该使用DOM,SAX还是StAX? 我知道有一些特定的库可以用java阅读RSS源,但由于这是一个大学项目,我不应该使用它们。 谢谢。

Java SAX解析

我需要解析一个XML流。 因为我只需要做一次并构建我的java对象,所以SAX看起来是自然的选择。 我正在扩展DefaultHandler并实现startElement,endElement和characters方法,在我的类中有成员保存当前读取值(在characters方法中)。 我做我需要的东西没有问题,但我的代码变得非常复杂,我确信没有理由这样做,我可以做不同的事情。 我的XML结构是这样的: 2009 9 true 2007 11 2009 7 当我意识到在文件的几个区域中使用相同的标记名称时,我的问题就出现了。 例如,玩家和团队都存在id和name。 我想创建我的java类Player和Team的实例。 在解析时,我保留了布尔标志,告诉我我是否在团队部分,以便在endElement中我知道该名称是团队的名称,而不是玩家的名字等等。 这是我的代码的样子: public class MyParser extends DefaultHandler { private String currentValue; private boolean inTeamsSection = false; private Player player; private Team team; private List teams; public void characters(char[] ch, int start, int length) throws SAXException { currentValue = new String(ch, […]

Java:如何在JTree中显示XML文件

我想有办法在JTree显示XML文件的内容。 我已经使用DOM,通过实现自定义TreeModel (和TreeCellRenderer )来完成此操作。 然而它非常笨重(很多变通方法和hackery)并且边缘相当粗糙。 是否有人知道如何让JTree显示XML文件的内容,用SAX解析? 谢谢!

Java XML解析:避免实体引用解析

我目前正在使用DOM解析器解析XHTML文档,例如: final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(false); final DocumentBuilder db = dbf.newDocumentBuilder(); db.setEntityResolver(MY_ENTITY_RESOLVER); db.setErrorHandler(MY_ERROR_HANDLER); … final Document doc = db.parse(inputSource); 我的问题是当我的文档包含实体引用时,例如: € 我的解析器为该内容创建一个Text节点,其中包含“€”而不是“€”。 也就是说,它正在以它应该的方式解析实体(XHTML 1.0 Strict DTD链接到ENTITIES Latin1 DTD,后者又建立了“€”与“€”的等价性)。 问题是,我不希望解析器做这样的事情。 我想保留“€” 文本未经修改 。 我已经尝试过了: final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false); 但: 我不喜欢这个,因为我担心这可能会使一些解析器实现无法从XHTML 1.0 Strict DTD 导航到ENTITIES Latin1 DTD,因此不考虑“€” 作为声明的实体。 当我这样做时,它奇怪地创建了两个节点:一个“磅”实体节点,以及一个带有“€”符号的Text节点。 有任何想法吗? 是否有可能在DOM Parser中配置它而不需要预处理 XHTML并用所有“&”符号代替其他东西?… 解决方案可以是DOM解析器,也可以是SAX解析器,我不介意使用SAX解析,然后使用转换创建我的DOM […]

Java中的高效XSLT管道(或将结果重定向到源)

我有一系列相互馈送的XSL 2.0样式表,即样式表A的输出馈送B馈送C. 这样做最有效的方法是什么? 重新提出的问题是:如何有效地将一个转换的输出路由到另一个转换。 这是我的第一次尝试: @Override public void transform(Source data, Result out) throws TransformerException{ for(Transformer autobot : autobots){ if(autobots.indexOf(autobot) != (autobots.size()-1)){ log.debug(“Transforming prelim stylesheet…”); data = transform(autobot,data); }else{ log.debug(“Transforming final stylesheet…”); autobot.transform(data, out); } } } private Source transform(Transformer autobot, Source data) throws TransformerException{ DOMResult result = new DOMResult(); autobot.transform(data, result); Node node = result.getNode(); […]

如何让SAX解析器从xml声明中确定编码?

我正在尝试解析来自不同来源的xml文件(我无法控制)。 其中大多数都是用UTF-8编码的,并且使用以下代码段不会导致任何问题: SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); FeedHandler handler = new FeedHandler(); InputSource is = new InputSource(getInputStream()); parser.parse(is, handler); 由于SAX默认为UTF-8,这很好。 但是有些文件声明: 即使声明ISO-8859-1 SAX仍然默认为UTF-8。 只有我添加: is.setEncoding(“ISO-8859-1”); SAX会使用正确的编码吗? 如何在没有专门设置的情况下让SAX自动检测xml声明中的正确编码? 我需要这个,因为我事先不知道文件的编码是什么。 艾琳,提前谢谢

使用SAX解析常见的XML元素

我目前正在使用SAX(Java)来解析一些不同的XML文档,每个文档代表不同的数据并且结构略有不同。 因此,每个XML文档都由不同的SAX类(子类化DefaultHandler )处理。 但是,有一些XML结构可以出现在所有这些不同的文档中。 理想情况下,我想告诉解析器“嘿,当你到达complex_node元素时,只需使用ComplexNodeHandler来读取它,然后给我回复结果。如果你到达some_other_node ,使用OtherNodeHandler读取它然后给我回复结果”。 但是,我看不出一个明显的方法来做到这一点。 我应该只是制作一个单片处理程序类,它可以读取我拥有的所有不同文档(并根除代码重复),还是有更智能的方法来处理它?

为什么sax解析比dom解析更快? stax是如何工作的?

有点相关: 来自java的libxml2 是的,这个问题相当啰嗦 – 抱歉。 我保持尽可能密集。 我把这些问题加粗,以便在阅读整篇文章之前更容易窥视。 为什么sax解析比dom解析更快? 我唯一能想到的就是w / sax你可能忽略了大部分传入数据,因此不会浪费时间处理你不关心的xml部分。 IOW – 解析w / SAX后,无法重新创建原始输入。 如果您编写了SAX解析器,以便它占据每个xml节点(并因此可以重新创建原始节点),那么它不会比DOM更快吗? 我问的原因是我正在尝试更快地解析xml文档。 我需要在解析后访问整个xml树。 我正在编写一个插入第三方服务的平台,所以我无法预测xml文档的哪些部分需要以及哪些部分不需要。 我甚至不知道传入文件的结构。 这就是为什么我不能使用jaxb或sax。 内存占用对我来说不是问题,因为xml文档很小,我一次只需要1个内存。 这是解析这个相对较小的xml文档所花费的时间。 我之前没有使用过stax,但也许我需要进一步调查,因为它可能是中间地带? 如果我理解正确,stax会保留原始的xml结构并处理我要求的部分吗? 通过这种方式,原始的解析时间可能很快,但每次我要求它遍历尚未遍历的树的一部分时,那就是处理发生的时间? 如果您提供了回答大多数问题的链接,我会接受您的回答(如果他们已经在其他地方得到回答,您不必直接回答我的问题)。 更新:我在sax中重写了它,并在avg 2.1 ms上解析文档。 这比dom所采用的2.5毫秒有所改善(快16%),但这并不是我(等人)猜到的那么大。 谢谢

SAX解析器可以在Java中使用XPath吗?

我正在尝试迁移我的一个类,它使用带有大量XPath表达式的DOM解析来进行SAX解析。 DOM解析对我来说很好,但是我尝试解析的一些文件太大而导致服务器超时。 我想重用XPath与SAX解析,但我不确定是否可能,如果不可能,请你帮助我,因为我不知道当我只使用SAX时,以下代码将如何: Document doc = bpsXml.getDocument(); String supplierName = BPSXMLUtils.getXpathString(doc, “/Invoice/InvoiceHeader/Party[@stdValue=’SU’]/Name/Name1”); String language = BPSXMLUtils.getXpathString(doc, “/Invoice/InvoiceHeader/InvoiceLanguage/@stdValue”);

在java中解析非常大的XML文档(以及更多)

(以下所有内容均以Java编写) 我必须构建一个应用程序,将可能非常大的XML文档作为输入。 该文档是加密的 – 不是使用XMLsec,而是使用我客户的预先存在的加密算法 – 将分三个阶段进行处理: 首先,根据上述算法解密流。 其次,扩展类(由我提供的API的第三方编写)将读取文件的某些部分。 读取的数量是不可预测的 – 特别是它不能保证在文件的标题中,但可能出现在XML中的任何位置。 最后,另一个扩展类(相同的交易)将输入XML细分为1..n子集文档。 这些可能会在某些方面与第二个操作处理的文档部分重叠,即:我相信我需要回顾我用来处理这个对象的任何机制。 这是我的问题: 有没有办法在没有一次将整个数据读入内存的情况下执行此操作? 显然我可以将解密实现为输入流filter,但我不确定是否可以按照我描述的方式解析XML; 通过遍历,需要收集第二步的信息,然后通过倒回文档并再次传递它以将其拆分为作业,理想情况下释放文档的所有不再使用的部分他们已经过去了。