xml-parsing 相关问题

XML解析器遍历包含XML树的文本文档,并允许使用层次结构中的信息。将此标记用于实现XML解析器的问题,或者通过使用给定语言的现有解析器生成的问题。

当子节点变化时将 XML 节点提取到数据框中

我正在 R 中构建代码,以从 IRS990PF 文件中提取 XML 格式的拨款数据。我构建了以下代码,该代码可以很好地为仅包含美国受助者的文件构建数据框。然而,那...

回答 1 投票 0

在 Python 中从文件路径解析 MusicXML 文件时遇到问题

我正在开发一个Python项目,我需要解析MusicXML文件。到目前为止,我已经手动将这些文件中的内容复制到字符串变量中,并且代码运行良好。然而,...

回答 1 投票 0

如何在 xml 模式中使用序列和非序列子级

1。我有一个格式良好的 xml,如下所示 g0 测试 a ...

回答 1 投票 0

如何在 xml 模式中使用序列和非序列子代

1。我有一个格式良好的 xml,如下所示 g0 测试 a ...

回答 1 投票 0

XML 文档未根据 XSD 架构进行验证

我有以下 XML 架构: 我有以下 XML 架构: <?xml version="1.0" encoding="utf-16"?> <xs:schema xmlns:tns="http://www.orbis-software.com/WebSvcCon" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.orbis-software.com/WebSvcCon" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="totalResults" type="xs:unsignedShort" /> <xs:element maxOccurs="unbounded" name="summaries"> <xs:complexType> <xs:sequence> <xs:element name="itemIdentifier"> <xs:complexType> <xs:sequence> <xs:element name="sku" type="xs:string" /> <xs:element name="id" type="xs:decimal" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="qualifier" /> <xs:element name="totalReceived" type="xs:decimal" /> <xs:element name="allocated" type="xs:decimal" /> <xs:element name="available" type="xs:decimal" /> <xs:element name="onHold" type="xs:decimal" /> <xs:element name="onHand" type="xs:decimal" /> <xs:element name="facilityId" type="xs:unsignedByte" /> </xs:sequence> <xs:attribute name="Array" type="xs:boolean" use="required" /> </xs:complexType> </xs:element> <xs:element name="_links"> <xs:complexType> <xs:sequence> <xs:element name="self"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="next"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="prev"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 我正在验证的特定 XML 文档中没有“下一个”字段(尽管某些文档可以)。当我加载此文档时,我收到错误: Error validating source XML against schema - The element '_links' in namespace 'http://www.orbis-software.com/WebSvcCon' has invalid child element 'prev' in namespace 'http://www.orbis-software.com/WebSvcCon'. List of possible elements expected: 'next' in namespace 'http://www.orbis-software.com/WebSvcCon'. 根据 XSD,“下一个”元素设置为 minOccurs=0 使其成为可选,那么为什么我收到错误? 在您的架构中,_links元素的内容在中定义 <xs:element name="_links"> <xs:complexType> <xs:sequence> <xs:element name="self"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="next"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="prev"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> 作为三个元素的序列,即self、next和prev。这些元素都不是可选的,因为它们都没有 mixOccurs="0",每个元素的内容上只有 mixOccurs="0",因为它们可以包含 0 到无界 href 元素。 所以 <_links><self/><next/><prev/></_links> 是可能的,但你不能忽略这三个元素中的任何一个。

回答 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

如何在 Rest API Flutter 中发布/发送 XML 数据而不是 JSON?

我想使用 Flutter 在 Rest API 中发送/发布数据。但我找不到任何关于如何使用 Flutter 发送 XML 文件的解决方案。 我需要在 post API 中发送这些数据 我想使用 Flutter 在 Rest API 中发送/发布数据。但我找不到任何关于如何使用 Flutter 发送 XML 文件的解决方案。 I need to send this data in post API <?xml version="1.0" encoding="UTF-8"?> <Request StartDate="2020-07-05" EndDate="2020-07-05" ServiceID="0"> </Request> 下面给出了我尝试使用 flutter 的代码 Future<HttpClientResponse> _send() async { var builder = new xml.XmlBuilder(); builder.processing('xml', 'version="1.0" encoding="iso-8859-9"'); builder.element('Request', nest: () { builder.attribute('StartDate', '2020-06-02'); builder.attribute('EndDate', '2020-07-02'); builder.attribute('ServiceID', '0'); }); var bookshelfXml = builder.build(); String _uriMsj = bookshelfXml.toString(); String _uri = "https://my_url"; var _responseOtp = post(_uri, _uriMsj); print("_responseOtp: $_responseOtp"); } //**POST XML:** Future<String> post(String _uri, String _message) async { HttpClient client = new HttpClient(); HttpClientRequest request = await client.postUrl(Uri.parse(_uri)); request.write(_message); HttpClientResponse response = await request.close(); StringBuffer _buffer = new StringBuffer(); await for(String a in await response.transform(utf8.decoder)) { _buffer.write(a); } print("_buffer.toString: ${_buffer.toString()}"); return _buffer.toString(); } 它返回这个响应 _responseOtp: Instance of 'Future<String>' I/flutter ( 9755): _buffer.toString: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> I/flutter ( 9755): <Response type="service-response"> I/flutter ( 9755): <ResponseCode>1020</ResponseCode> I/flutter ( 9755): <ResponseStatus>error</ResponseStatus> I/flutter ( 9755): <ResponseMessage>Requête invalide</ResponseMessage> I/flutter ( 9755): </Response> 此数据与邮递员配合得很好 您需要正常调用..只需更改标题即可。 'Content-type' : 'text/xml', 这样打电话 return await http.post( fullUrl, body:data, // data is your normal json data as a string, headers: { 'Content-type' : 'text/xml', } ); 确保使用 async 和 wait 才能正确获得结果。

回答 1 投票 0

使用 xslt 将 XML 转为 CSV 创建额外的行

我有这个 XML,我想要 csv 格式: 我正在使用 python 和 lxml.etree 库 我有这个XML,我想要一个csv格式: 我正在使用 python 和 lxml.etree 库 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RsuProtocol schemaVersion="1.11" RefSchemaFile="xxxx.xsd"> <UpdateStep> <Phase>x1Activation</Phase> <TimestampStart>1687771672000</TimestampStart> <TimestampEnd>1687771828000</TimestampEnd> </UpdateStep> <UpdateStep> <Phase>x2Execution</Phase> <TimestampStart>1687771828000</TimestampStart> <TimestampEnd>1687771907000</TimestampEnd> <Warning> <WarnCode>0x00000000</WarnCode> <Count>2</Count> <FirstOccurrence>1687771907</FirstOccurrence> <SpecificWarnCode>blablabla</SpecificWarnCode> <WarnMessage>Hello</WarnMessage> </Warning> <Warning> <WarnCode>0x11111111</WarnCode> <Count>1</Count> <FirstOccurrence>1687771907</FirstOccurrence> <SpecificWarnCode>helo</SpecificWarnCode> <WarnMessage>Hello</WarnMessage> </Warning> </UpdateStep> <UpdateStep> <Phase>x3MguCompletion</Phase> <TimestampStart>1687771907000</TimestampStart> <TimestampEnd>1687771965000</TimestampEnd> </UpdateStep> </RsuProtocol> 我想要这样的输出: "1","x1Activation","","2023-06-26 09:27:52.000000000","2023-06-26 09:30:28.000000000","","","","","" "2","x2Execution","","2023-06-26 09:30:28.000000000","2023-06-26 09:31:47.000000000","0x00000000","2","2023-06-26 09:31:47.000000000","blablabla","Hello" "3","x2Execution","","2023-06-26 09:30:28.000000000","2023-06-26 09:31:47.000000000","0x11111111","1","2023-06-26 09:31:47.000000000","helo","Hello" "4","x3Completion","","2023-06-26 09:31:47.000000000","2023-06-26 09:32:45.000000000","","","","","" 我有这样的输出: "1","x1Activation","","2023-06-26 09:27:52.000000000","2023-06-26 09:30:28.000000000","","","","","" "2","x2Execution","","2023-06-26 09:30:28.000000000","2023-06-26 09:31:47.000000000","0x00000000","2","2023-06-26 09:31:47.000000000","blablabla","Hello" "3","x3Completion","","2023-06-26 09:31:47.000000000","2023-06-26 09:32:45.000000000","","","","","" 使用我正在使用的 xslt,我仅获取 Phase= 'x2Execution' 的一行,我想获取两个“警告”信息,该阶段的每一行各一个。 这是我正在使用的xslt: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/RsuProtocol" name="FBM_UPDATE"> <xsl:for-each select="UpdateStep"> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="position()"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Phase"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="DiagnosisAddress"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data"> <xsl:call-template name="get-datetime-from-timestamp"> <xsl:with-param name="timestamp"> <xsl:call-template name="convert-to-null"> <xsl:with-param name="input" select="TimestampStart"/> <xsl:with-param name="value" select="'-1'"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:with-param> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data"> <xsl:call-template name="get-datetime-from-timestamp"> <xsl:with-param name="timestamp"> <xsl:call-template name="convert-to-null"> <xsl:with-param name="input" select="TimestampEnd"/> <xsl:with-param name="value" select="'-1'"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:with-param> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/WarnCode"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/Count"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data"> <xsl:call-template name="get-datetime-from-timestamp"> <xsl:with-param name="timestamp"> <xsl:call-template name="convert-to-null"> <xsl:with-param name="input" select="Warning/FirstOccurrence"/> <xsl:with-param name="value" select="'-1'"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:with-param> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/SpecificWarnCode"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/WarnMessage"/> <xsl:with-param name="no-delim" select="'true'"/> </xsl:call-template> <xsl:value-of select="$new-line"/> </xsl:for-each> </xsl:template> </xsl:stylesheet> 您发布的样式表会抛出错误,因为指定的模板丢失。 不过,我认为实际问题已经足够清楚了,所以这里有一个简化的示例,您可以将其用作起点: XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:template match="/RsuProtocol"> <xsl:apply-templates select="UpdateStep"/> </xsl:template> <xsl:template match="UpdateStep"> <xsl:variable name="common"> <xsl:text>,</xsl:text> <xsl:value-of select="Phase"/> <xsl:text>,</xsl:text> <xsl:value-of select="TimestampStart"/> <xsl:text>,</xsl:text> <xsl:value-of select="TimestampEnd"/> <xsl:text>,</xsl:text> </xsl:variable> <xsl:choose> <xsl:when test="Warning"> <xsl:apply-templates select="Warning"> <xsl:with-param name="common" select="$common"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:number count="UpdateStep[not(Warning)] | Warning" level="any"/> <xsl:value-of select="$common"/> <xsl:text>"",""&#10;</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="Warning"> <xsl:param name="common"/> <xsl:number count="UpdateStep[not(Warning)] | Warning" level="any"/> <xsl:value-of select="$common"/> <xsl:value-of select="WarnCode"/> <xsl:text>,</xsl:text> <xsl:value-of select="Count"/> <xsl:text>&#10;</xsl:text> </xsl:template> </xsl:stylesheet> 应用于您的输入 XML 示例,这将产生: 结果 1,x1Activation,1687771672000,1687771828000,"","" 2,x2Execution,1687771828000,1687771907000,0x00000000,2 3,x2Execution,1687771828000,1687771907000,0x11111111,1 4,x3MguCompletion,1687771907000,1687771965000,"","" 或者,您可以分两遍进行转换:首先,通过使每个警告成为一个完整步骤(包含父步骤中的所有数据)来“展平”输入;然后统一处理结果,为每个步骤创建一行。

回答 1 投票 0

Groovy - 删除 XML 负载中的非唯一值

我正在尝试从 xml 有效负载中提取两个节点。但它会导致一些重复值。有没有办法获得唯一的值组合或稍后删除重复值。 我...

回答 1 投票 0

如何解析 Snowflake 中 XML VARIANT 列中的数组?

我有一个带有 VARIANT 列的表,其中包含来自 Snowpipe 的 XML。我能够使用 XMLGET 和 GET 的奇怪组合来解析大多数字段的 XML。然而,有一个领域...

回答 1 投票 0

需要更新将作为 Perl 脚本的输入给出的 xml 标签?

我计划编写一个脚本来更新 XML 标记值。 我的要求: 必须更改的标签值将由用户选择。有时可能不止一个。 脚本应该抛出一个

回答 1 投票 0

根据java中的模板将xml解析为pdf

我需要根据模板将xml解析为pdf,该模板不需要再次生成战争并在我的服务器中重新部署。 我使用 JAXB 将 xml 解析为我的 java 实体,之后我想要...

回答 2 投票 0

使用parse-xml将文本转换为XML中的节点

我正在处理来自 Access 数据库的 XML 输出,其中某些节点内的文本需要通过 XSLT 转换为节点本身,然后通过 Adobe FrameMaker 运行到

回答 1 投票 0

使用 PHP 从 TMX (XML) 内容中提取标签

我正在构建一个基于浏览器的TMX(翻译记忆库)编辑器。当源片段和/或目标片段包含标签时,我的内容提取脚本会中断。包含标签的源/目标字符串看起来...

回答 1 投票 0

Android Retrofit + XML 响应给出此错误:java.lang.RuntimeException:org.simpleframework.xml.core.PersistenceException

我有一个 API,它返回以下 XML 响应(查看屏幕截图) 我正在使用带有 XML 的 Retrofit,检查我的依赖项: 实现 'com.squareup.retrofit2:retrofit:2.9.0' //复古...

回答 1 投票 0

无法在 python xml.etree.ElementTree 中找到访问 XPath 中的元素

我一直在兜圈子。我的任务是读取 xml 文档。解析记录以查找 ID。使用该 ID 执行一些 SQL。然后将 xml 的值与 SQL 的值进行比较。如果...

回答 1 投票 0

如何在Python中高效解析和处理大型XML文件?

我有一个Python程序需要解析和处理大型XML文件,但在处理几GB大小的文件时遇到性能问题。 我目前正在使用

回答 2 投票 0

解析 dotnet 中包含两个命名空间的 XML

我有一个从 wcf 返回的 xml,我必须将其反序列化为对象。不幸的是我无法使用 wcf 数据契约,因为我的公司正在淘汰 WCF,所以这个解决方案...

回答 1 投票 0

如何在SQL Server中获取xml列的值

如何获取列的XML值? SELECT PaymentMethodDetail.value('(/ paymentMethodDetail/EFTPaymentDetails/AccountType/text())[0]','varchar(30)') as AccounType,* FROM paymentTable <

回答 1 投票 0

使用 CROSS APPLY 进行 SQL Server XML 解析

我一直在研究这个 XML,它嵌套在 SQL Server 中表的一列中。 我有一个代码直到几天前才对我有用,但我目前遇到的问题是我无法解决

回答 1 投票 0

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