sax 相关问题

SAX代表Simple API for XML,是一种从文档中读取XML数据的基于事件的方法。

在 Java 中将字符串验证为 XML

字符串strXML =“abc9876543210” 如何验证是否...

回答 2 投票 0

什么是“TBS 块”?

我计划编写一个 SAX2 XML 解析器,并且希望支持尽可能多的标准选项。然而,我真的很挠头试图理解 http://xml.org/sax/proper...

回答 1 投票 0

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>

回答 2 投票 0

Java 8 中的默认 SAX 解析器

我正在努力理清 SAX/DOM 与 Java 集成的顺序。我发现网上的信息很混乱。如果有人能回答一些问题,可能是刀,si...

回答 1 投票 0

SAX 解析 - 将嵌套标签映射到主标签

我想对大型 XML 文件使用 SAX 解析器。处理程序如下所示: DefaultHandler 处理程序 = new DefaultHandler() { 字符串温度; HashSet < String > xml_Elements = 新 LinkedHa...

回答 1 投票 0

SAX 解析 - 将嵌套标签映射到主标签

我想对大型 XML 文件使用 SAX 解析器。处理程序如下所示: DefaultHandler 处理程序 = new DefaultHandler() { 字符串温度; HashSet < String > xml_Elements = 新 LinkedHash...

回答 1 投票 0

在 SAX 解析器中确定一个标签是否在另一个标签内

有一个 XML,我使用 SAX 解析器解析它。现在假设我在元素 startElement(..) 的开头收到一条通知 这时候我就会知道SAX解析器所在的标签名...

回答 1 投票 0

在 python3 中读取 XML 节点的可选属性

我正在尝试在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')

回答 1 投票 0

Spring Boot 2.6.1 不支持 SAX 功能

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 的答案并升级你的版本。这样做对我也有帮助。

回答 3 投票 0

Java XML 解析器复制列表中的元素

我有一个 SAX2 XML 解析器,我想执行特定的操作。 在 frame 元素开始时将一个对象添加到 tileFrames 列表(与每个动画元素中的 frame 一样多), 添加字符串 currentTi ...

回答 2 投票 0

Java SAX XML 解析器复制列表中的元素

我有一个 SAX2 XML 解析器,我想执行特定的操作。 在 frame 元素开始时将对象添加到 tileFrames 列表(与每个动画元素中的 frame 一样多, 添加字符串 currentTil...

回答 1 投票 0

Python3 SAX - 解析内部实体名称而不是解析它们

我想解析一个 XML 文档(JMdict 字典),它是一个条目列表,其中包含代表条目属性的元素,例如 &vr;, ...

回答 0 投票 0

sax批量插入数据库丢失记录

我使用 sax 和 zlib 读取了一个 gz 文件,然后更新了我的数据库, 看来我跳过了一些文件内容。 这是我的代码: // 变量来证明奇怪的行为 让记录数 = 1; 让

回答 1 投票 0

在读取流和更新数据库时使用 sax 和 zlib - 奇怪的行为

我使用 sax 和 zlib 读取了一个 gz 文件,然后更新了我的数据库, 看来我跳过了一些文件内容。 这是我的代码: // 变量来证明奇怪的行为 让记录数 = 1; 让

回答 1 投票 0

使用SAX解析器动态读取标签。

我试图使用SAX解析器动态读取XML,我已经尝试使用这个例子,但在这个例子中,我必须为所有的子标签硬编码(创建一个变量),请建议是否有任何......

回答 1 投票 0

用UTF-8字符编码特殊字符

我有一个字符串地址:Mount Road(Back)[Contact-Ron]并给他{data}我需要使用SAX解析器,并且它不解析特殊字符,我们需要将它们替换为UTF-8字符。 ...

回答 1 投票 0

在Kotlin中使用SAX进行异步XML解析

[我有一个SAX解析器,它读取XML文件(特别是.xlsx文件),并将内容作为Row对象的列表返回:大致类似于这种有趣的readExcelContent(data:InputStream){val pkg = ...

回答 1 投票 0

用Python中的&符号修复无效的XML

我正在使用Python处理从其他系统收到的XML文件。该系统产生无效的XML。主要是,它不会转义XML中的某些&。例如,我有几行...

回答 2 投票 5

如何从Node中的两个文件创建一个读取流?

我对NodeJS流和fileStream非常陌生。我正在尝试使用SAX解析两个XML文件。我已经成功地将其用于单个文件:const fs = require('fs'); const sax = require(“ ...

回答 1 投票 0

如何使用JAXP SAX解析器忽略XML注释中包含的数据?

我有一个很大的XML文件,其中包含许多键值对。该文件包含多行注释和实际数据。在注释部分中,有一些示例如何说明数据/键值对...

回答 1 投票 2

© www.soinside.com 2019 - 2024. All rights reserved.