SAX代表Simple API for XML,是一种从文档中读取XML数据的基于事件的方法。
我有一个 BufferedInputStream,我想用 SAXParser 从中解析 XML,然后再次重用它(例如,mark(int) 和 reset())。然而这个流在 parse() 方法中被关闭。有没有可能这样...
有没有一种方法可以通过 SAX/DOM 解析 XML,并且每个节点都有可用的行号
我已经为大型 XML 文档格式编写了一个 DOM 解析器,其中包含许多可用于自动生成 Java 代码的项目。这仅限于
eclipse 中的 SaxParseException:XML 文档结构必须在同一实体内开始和结束
我正在使用JAVA的last.fm API,可以在这里找到。 我有一个巨大的数据集,其中我仅使用包含用户艺术家历史和播放的文件。我用Java编写了一段代码,其中扩展...
要编写 xml 代码,我使用以下代码: 导入 javax.xml.stream.XMLOutputFactory; 导入 javax.xml.stream.XMLStreamWriter; ... XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstan...
我尝试使用sax js来分块处理xml文件,将其添加到有限大小的数组中,等待更新数据库,然后重置数组。 问题是它不能异步工作......
在使用命名空间时,我尝试了无数种方法从 Python 的 SAX 解析器中获取属性值,但找不到方法。这里一定有一个简单的解决方案,但为了我的生活,我可以......
我需要使用java中的SAX解析器来解析文档。如果我使用传统上实现 startElement、endElement 和字符方法的 DefaultHandler 类,我就能够打印所有节点值...
从 java 5 迁移到 java 6 后出现 SAXParseException
我在将应用程序从 Java 5 迁移到 java 6 时遇到问题。 这是一些在 Java5 上运行良好的单元测试。 单元测试的代码是: 公共空间
我正在创建一个包含大量数据的Excel文件,因此我不得不选择SAX技术,但我在任何地方都找不到如何冻结第一行以便滚动时的示例
在 Java 中使用 SAX api 解析流输入中没有根元素的 XML 片段列表是否可行? 我尝试解析这样的 XML 但得到了 org.xml.sax.SAXParseException:标记...
我计划编写一个 SAX2 XML 解析器,并且希望支持尽可能多的标准选项。然而,我真的很挠头试图理解 http://xml.org/sax/proper...
StaX解析:Transformer.transform方法自动移动光标,并不总是很好
我正在使用 XMLStreamReader 来实现我的目标(分割 xml 文件)。看起来不错,但仍然没有给出想要的结果。我的目标是从输入文件中分割每个节点“nextTag”: 我正在使用 XMLStreamReader 来实现我的目标(分割 xml 文件)。看起来不错,但仍然没有给出想要的结果。我的目标是从输入文件中分割每个节点“nextTag”: <?xml version="1.0" encoding="UTF-8"?> <firstTag> <nextTag>1</nextTag> <nextTag>2</nextTag> </firstTag> 结果应该是这样的: <?xml version="1.0" encoding="UTF-8"?><nextTag>1</nextTag> <?xml version="1.0" encoding="UTF-8"?><nextTag>2</nextTag> 参考使用Java分割1GB Xml文件我用这段代码实现了我的目标: import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringWriter; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamResult; public class Demo4 { public static void main(String[] args) throws Exception { InputStream inputStream = new FileInputStream("input.xml"); BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); XMLInputFactory factory = XMLInputFactory.newInstance(); TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); XMLStreamReader streamReader = factory.createXMLStreamReader(in); while (streamReader.hasNext()) { streamReader.next(); if (streamReader.getEventType() == XMLStreamReader.START_ELEMENT && "nextTag".equals(streamReader.getLocalName())) { StringWriter writer = new StringWriter(); t.transform(new StAXSource(streamReader), new StreamResult( writer)); String output = writer.toString(); System.out.println(output); } } } } 其实很简单。但是,我的输入文件是单行形式: <?xml version="1.0" encoding="UTF-8"?><firstTag><nextTag>1</nextTag><nextTag>2</nextTag></firstTag> 我的 Java 代码不再产生所需的输出,而只是这个结果: <?xml version="1.0" encoding="UTF-8"?><nextTag>1</nextTag> 花了几个小时后,我很确定已经找出原因了: t.transform(new StAXSource(streamReader), new StreamResult(writer)); 这是因为,执行完transform方法后,光标会自动前进到下一个事件。在代码中,我有这个分数: while (streamReader.hasNext()) { streamReader.next(); ... t.transform(new StAXSource(streamReader), new StreamResult(writer)); ... } 第一次变换后,streamReader直接获取2次next(): 1. from the transform method 2. from the next method in the while loop 因此,对于此特定行 XML,光标永远无法到达第二个打开标记。 相反,如果输入 XML 具有漂亮的打印形式,则可以从光标到达第二个,因为第一个结束标记后面有一个空格事件 不幸的是,我找不到任何如何进行设置的内容,因此变换器在执行变换方法后不会自动跳到下一个事件。这太令人沮丧了。 有人知道我该如何处理吗?在语义上也很受欢迎。非常感谢。 问候, 拉特纳 PS。我肯定可以为这个问题写一个解决方法(在转换之前漂亮地打印 xml 文档,但这意味着输入 xml 之前已被修改,这是不允许的) 正如您所阐述的,如果元素节点直接相互跟随,转换步骤是否会继续到下一个创建元素。 为了解决这个问题,您可以使用嵌套 while 循环重写代码,如下所示: while(reader.next() != XMLStreamConstants.END_DOCUMENT) { while(reader.getEventType() == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals("nextTag")) { StringWriter writer = new StringWriter(); // will transform the current node to a String, moves the cursor to the next START_ELEMENT t.transform(new StAXSource(reader), new StreamResult(writer)); System.out.println(writer.toString()); } } 如果您的 xml 文件适合内存,您可以在 JOOX 库的帮助下尝试,该库在 gradle 中导入,例如: compile 'org.jooq:joox:1.3.0' 还有主类,比如: import java.io.File; import java.io.IOException; import org.joox.JOOX; import org.joox.Match; import org.w3c.dom.Document; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import static org.joox.JOOX.$; public class Main { public static void main(String[] args) throws IOException, SAXException, TransformerException { DocumentBuilder builder = JOOX.builder(); Document document = builder.parse(new File(args[0])); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty("omit-xml-declaration", "no"); final Match $m = $(document); $m.find("nextTag").forEach(tag -> { try { transformer.transform( new DOMSource(tag), new StreamResult(System.out)); System.out.println(); } catch (TransformerException e) { System.exit(1); } }); } } 它产生: <?xml version="1.0" encoding="UTF-8"?><nextTag>1</nextTag> <?xml version="1.0" encoding="UTF-8"?><nextTag>2</nextTag>
我正在努力理清 SAX/DOM 与 Java 集成的顺序。我发现网上的信息很混乱。如果有人能回答一些问题,可能是刀,si...
我想对大型 XML 文件使用 SAX 解析器。处理程序如下所示: DefaultHandler 处理程序 = new DefaultHandler() { 字符串温度; HashSet < String > xml_Elements = 新 LinkedHa...
我想对大型 XML 文件使用 SAX 解析器。处理程序如下所示: DefaultHandler 处理程序 = new DefaultHandler() { 字符串温度; HashSet < String > xml_Elements = 新 LinkedHash...
有一个 XML,我使用 SAX 解析器解析它。现在假设我在元素 startElement(..) 的开头收到一条通知 这时候我就会知道SAX解析器所在的标签名...
我正在尝试在Python3中的SAX中读取XML文件,因为在我的宠物项目中,我在inptu中有一个代表一些GTD项目1的XML文件的完整目录。 该文件具有这种格式 我正在尝试在Python3中的SAX中读取XML文件,因为在我的宠物项目中,我在inptu中有一个代表一些GTD项目的XML文件的完整目录1. 文件具有这种格式 <project name = "name of project"> <action number="2" > action to do</action> </project> 我的 SAX 解析位于类 MyHandler 中,我的问题是我已将属性“number”定义为可选,但它不起作用。 在说明中 def startElement(self, tagName, attrs): #etc elif tag_name.isAction(): self.priority = attrs['number'] if 'number' in tagName else '0' 我验证当前标签是否是 Action 标签:如果是,我填充类的 self.priority 属性,读取 XML 属性“number”(如果存在),否则我输入“0”。 我的问题是 attrs['number'] 如果 tagName 中有 'number' 在任何情况下都是错误的 如何在 startElement 方法中验证 tagName 是否具有属性“number”? 在 stackoverflow 中我只找到了 Stax 的示例 谢谢你 tagName 没有“拥有”任何东西,它只是一个字符串。 in 运算符检查标签名称内的子字符串 number。 'number' in 'somenumberthing' 评估为 true。显然这不是你想要的。 attr具有实际值;您正在寻找的条件是:“如果属性具有键“数字”的值”,例如: self.priority = attrs['number'] if 'number' in attrs else '0' 这是类似 dict 的对象的一种非常常见的模式,我认为这就是 SAX 为您提供的,所以我建议使用具有默认值的 get 方法: self.priority = attrs.get('number', default='0')
Spring boot 2.6.1支持logback 1.2.7 我在项目中添加了以下依赖项 ch.qos.logback Spring boot 2.6.1支持logback 1.2.7 我在项目中添加了以下依赖项 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> 但是构建失败,出现以下异常: Caused by: javax.xml.parsers.ParserConfigurationException: SAX feature 'http://xml.org/sax/features/external-general-entities' not supported. at oracle.xml.jaxp.JXSAXParserFactory.setFeature(JXSAXParserFactory.java:272) at ch.qos.logback.core.joran.event.SaxEventRecorder.buildSaxParser(SaxEventRecorder.java:82) ... 44 more 在 SaxEventRecorder.class 中,它在构建 SAX 解析器时失败 private SAXParser buildSaxParser() throws JoranException { try { SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setValidating(false); //spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); spf.setFeature("http://xml.org/sax/features/external-general-entities", false); spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); spf.setNamespaceAware(true); return spf.newSAXParser(); } catch (Exception pce) { String errMsg = "Parser configuration error occurred"; addError(errMsg, pce); throw new JoranException(errMsg, pce); } } 有没有办法覆盖实现? 谢谢:) 在升级过程中遇到同样的问题。这不是 Spring 问题,您不想自己重写实现。 SAXParserFactory 是一个抽象类——它可以有多个实现。 newInstance 方法选择类路径上的最后一个/顶部实现。 我发现我的类路径上有一个“额外”的实现,因为依赖项有自己的 SAXParserFactory 实现,而不是 Logback 期望的“典型”实现。而这个“额外的”SAXParserFactory 不支持 Logback 试图启用的功能。 我必须在我的依赖项中显式声明一个 xerces 实现,以便“真实”实现优先于类路径上的其他“额外”实现。 所以我的建议是让你看看你有这个抽象类的实现(我可以使用 IntelliJ IDE 很容易地看到这个),然后管理/重新安排你的依赖关系,以便支持该功能的正确实现具有更高的优先级你的类路径。 对我来说,我们使用了一个旧的依赖项 <groupId>com.oracle.jdbc</groupId> <artifactId>ojdbc7</artifactId> <version>12.1.0.2</version> 更新到 <groupId>com.oracle.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>12.2.0.1</version> ojdbc8 解决了我的问题! 可能不是您要找的东西,但对于我的项目,我们决定排除此解析器: <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8-production</artifactId> <type>pom</type> <exclusions> <exclusion> <groupId>com.oracle.database.xml</groupId> <artifactId>xmlparserv2</artifactId> </exclusion> </exclusions> </dependency> 但是如果你真的需要它,我建议你看看@matzeihnsein 的答案并升级你的版本。这样做对我也有帮助。
我有一个 SAX2 XML 解析器,我想执行特定的操作。 在 frame 元素开始时将一个对象添加到 tileFrames 列表(与每个动画元素中的 frame 一样多), 添加字符串 currentTi ...