unmarshalling 相关问题

解组是将对象的存储或传输表示转换回其原始存储器表示的过程。这是编组的反面。

GO Lang 无法获取响应中的 XML 标头

我有一个 xml 存储在数据库中,我使用 GO 中的 xml.unmarshall 和我定义的结构对其进行解组。 获取 API 响应时,我没有获取 XML 标头和命名空间。 E型...

回答 1 投票 0

当我尝试解组 WebServiceResponse 时出现解组错误

我有来自第 3 方 API 的响应,它给我一个解组 xml 响应的错误,类似于: 我收到来自第 3 方 API 的响应,该响应给我一个解组 xml 响应的错误,类似于: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:webServiceResponse xmlns="http://ws.services.company.com" xmlns:ns2="http://rest.ws.services.company.com"> <ns2:result> <success>true</success> <id>7054986</id> </ns2:result> </ns2:webServiceResponse> 通常我会使用这样的 xml 响应来测试我的 Java 代码,并且获得成功: <webServiceResponse xmlns="http://ws.services.company.com"> <result> <success>true</success> <id>1</id> </result> </webServiceResponse> 在 Java 中,我一直在使用以下 xsd 文件创建相应的 XML 数据类。 CompanyWS.xsd <?xml version="1.0" encoding="UTF-8"?> <xsd:schema elementFormDefault="qualified" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" jxb:version="3.0" targetNamespace="http://ws.services.company.com" xmlns="http://ws.services.company.com" version="1.0" xmlns:ns2="http://ws.services.company.com" xmlns:ws="http://ws.services.company.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:include schemaLocation="CompanyWSTypes.xsd"/> <xsd:element name="someFunctionality"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="ns2:WebServiceRequest"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="someEvent" type="ns2:InteractObject"/> <xsd:element maxOccurs="1" minOccurs="1" name="recipientData" type="ns2:RecipientData"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:element name="someFunctionality2"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="ns2:WebServiceRequest"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="customEvent" type="ns2:CustomEvent"/> <xsd:element maxOccurs="1" minOccurs="1" name="recipientData" type="ns2:RecipientData"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:element name="webServiceResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="result" nillable="true" type="ns2:WebServiceResult"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> CompanyWSTypes.xsd <?xml version="1.0" encoding="UTF-8"?><xsd:schema elementFormDefault="qualified" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" jxb:version="3.0" targetNamespace="http://ws.services.company.com" version="1.0" xmlns:ns2="http://ws.services.company.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="InteractObject"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="folderName" type="ns2:minLengthString"/> <xsd:element maxOccurs="1" minOccurs="1" name="objectName" type="ns2:minLengthString"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="RecipientData"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="recipient" type="ns2:Recipient"/> <xsd:element maxOccurs="unbounded" minOccurs="0" name="optionalData" nillable="true" type="ns2:OptionalData"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Recipient"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="listName" type="ns2:InteractObject"/> <xsd:element maxOccurs="1" minOccurs="0" name="recipientId" nillable="true" type="xsd:long"/> <xsd:element maxOccurs="1" minOccurs="0" name="customerId" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="mobileNumber" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="emailAddress" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="permissionStatus" nillable="true" type="ns2:PermissionStatus"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="OptionalData"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" type="ns2:minLengthString"/> <xsd:element maxOccurs="1" minOccurs="1" name="value" type="ns2:minLengthString"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="minLengthString"> <xsd:restriction base="xsd:string"> <xsd:minLength value="1"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="CampaignType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="TRANSACTIONAL"/> <xsd:enumeration value="PROMOTIONAL"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="PermissionStatus"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="OPTIN"/> <xsd:enumeration value="OPTOUT"/> <xsd:enumeration value="NOT_SPECIFIED"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="PriorityLevel"> <xsd:restriction base="xsd:int"> <xsd:enumeration value="1"/> <xsd:enumeration value="2"/> <xsd:enumeration value="3"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="WebServiceRequest"> <xsd:sequence> <xsd:element maxOccurs="unbounded" minOccurs="0" name="additionalData" nillable="true" type="xsd:anyType"/> </xsd:sequence> <xsd:attribute name="transactionId" type="xsd:string"/> <xsd:attribute name="accountId" type="xsd:string"/> <xsd:attribute name="brandId" type="xsd:string"/> <xsd:attribute name="langLocale" type="xsd:string"/> <xsd:attribute default="1" name="priorityLevel" type="ns2:PriorityLevel"/> <xsd:attribute default="TRANSACTIONAL" name="campaignType" type="ns2:CampaignType"/> </xsd:complexType> <xsd:complexType name="CustomEvent"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="0" name="eventName" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventId" nillable="true" type="xsd:long"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventStringDataMapping" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventDateDataMapping" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventNumberDataMapping" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="WebServiceResult"> <xsd:sequence> <xsd:element name="success" type="xsd:boolean"/> <xsd:element minOccurs="0" name="id" nillable="true" type="xsd:long"/> <xsd:element minOccurs="0" name="error" nillable="true" type="ns2:WebServiceError"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="WebServiceError"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="0" name="code" nillable="true" type="ns2:ErrorCode"/> <xsd:element maxOccurs="1" minOccurs="0" name="message" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="ErrorCode"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="MISSING_REQUIRED_FIELD"/> <xsd:enumeration value="DATABASE_ERROR"/> <xsd:enumeration value="SERVER_ERROR"/> <xsd:enumeration value="LOGIN_ERROR"/> </xsd:restriction> </xsd:simpleType> </xsd:schema> 我得到的错误: Unable to unmarshal to WebServiceResponse. jakarta.xml.bind.UnmarshalException: unexpected element (uri:"http://rest.ws.services.company.com", local:"webServiceResponse"). Expected elements are <{http://ws.services.company.com}someFunctionality>,<{http://ws.services.company.com}someFunctionality2>,<{http://ws.services.company.com}webServiceResponse> at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:693) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:230) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:225) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:92) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1102) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:527) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:509) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137) ~[task/:?] . . . 任何人都可以帮忙解决这个问题吗? 我认为它无法将响应名称空间与 ns2 关联起来,ns2 与 uri 开头关联为 rest。但我无法在 xsd 文件上执行此操作以与 ns2 关联,因为它总是给出错误。 XSD 中的目标命名空间,因此在 Java 生成的代码中是 targetNamespace="http://ws.services.company.com",但您会在 webServiceResponse 命名空间中收到 http://rest.ws.services.company.com。 这就是解组器抱怨没有收到预期元素之一的原因 您的 XSD 是您自己创建的还是由其他人发送的?无论如何,要使其正常工作,您应该根据预期更改 targetNamespace(其中包含 rest 前缀)。

回答 1 投票 0

演示 JAXB 解组不会加载 XSD 模式

与此问题相关,给出以下名为 customer.xsd 的架构: 与这个问题相关,给出以下名为customer.xsd的模式: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="stringMaxSize5"> <xs:restriction base="xs:string"> <xs:maxLength value="5"/> </xs:restriction> </xs:simpleType> <xs:element name="customer"> <xs:complexType> <xs:sequence> <xs:element name="name" type="stringMaxSize5"/> <xs:element ref="phone-number" maxOccurs="2"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="phone-number"> <xs:complexType> <xs:sequence/> </xs:complexType> </xs:element> </xs:schema> 以下 XML 文档称为 input.xml: <customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./customer.xsd"> <name>Jane Doe</name> <phone-number/> <phone-number/> <phone-number/> </customer> 以及以下解组代码: import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlRootElement; public class Unmarshal { @XmlRootElement(name = "customer") public static class Customer { public String name; @XmlElement(name="phone-number") public List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>(); } public static class PhoneNumber {} public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Customer.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); unmarshaller.setSchema(null); Customer customer = (Customer) unmarshaller.unmarshal(new File("input.xml")); System.out.println(customer.name); } } Java 代码能够将 XML 输入文档反序列化为 Customer 的实例,即使此 XML 文档产生 2 个验证错误(由外部编辑器指示): cvc-maxLength-valid: Value 'Jane Doe' with length = '8' is not facet-valid with respect to maxLength '5' for type 'stringMaxSize5'.xml(cvc-maxLength-valid) cvc-type.3.1.3: The value 'Jane Doe' of element 'name' is not valid.xml(cvc-type.3.1.3) 和 cvc-complex-type.2.4.f: 'phone-number' can occur a maximum of '2' times in the current sequence. This limit was exceeded. No child element is expected at this point.xml(cvc-complex-type.2.4.f) 这意味着 JAXB 在解组期间没有验证给定的 XML 输入,但是: 鉴于 unmarshaller.setSchema(null); 设置为 DISABLE 模式验证,有没有办法证明在解组时 JVM 未访问 customer.xsd 文件的内容? 换句话说,有没有办法不盲目相信 JVM 不会加载 XSD 引用,即使模式验证显式设置为 null? 更新1: 目的是找出 XML 文档内的 XSD 架构引用有多大可能成为安全攻击媒介,如下所述: https://owasp.org/www-community/vulnerability/XML_External_Entity_(XXE)_Processing https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html 谢谢。 我并不真正理解检查这一点的必要性,但这里有一个简单的用例,应该证明在解组 XML 时 XSD 文件不会被 JVM 加载: 通过任何您想要的插件从 XSD 创建 Java 类,或者像这里一样,手动创建它。将其打包在 jar 文件中,其中不含 XSD(仅限 Java 类) 在另一个 Java 程序中从 XML 编写解组代码,该代码依赖于第一个 JAR,并在类路径中没有任何 XSD 的情况下运行它 ==> 即使不知道 XSD 架构,您的代码仍然可以工作 您还可以查看 Java 代码本身: 实现 com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl 接口的 Unmarshaller 的默认 schema 属性为 null(因此将其设置为 null 在上面的代码中是无操作的) 您的代码不引用您创建 Java XML-annotated-POJO 的 XSD 本身:JVM 无法猜测您是根据外部模式编写的代码。 您还可以在调试模式下运行程序,并看到 XSD 不会被加载(同样,您的 Java 代码中没有引用:您甚至可以删除它,这不会产生任何影响)。 不过,我希望我已经回答了你的问题。

回答 1 投票 0

Go 中的 XML 解组给出带有导出字段的空结果

在 Go 中进行 XML 解组时得到空结果。我研究了其他 SO 问题,我注意到最常见的原因似乎是这些字段未导出...

回答 2 投票 0

JiBX unmarshal 在 Jboss 7.3 版本中失败

Jboss从4.2升级到7.3后启动服务器时出现以下错误。代码没有进行任何更改。 BeanCreationException | BeanCreationException org.springframework.beans.factory.

回答 1 投票 0

Onvif - 解析来自 WS-BaseNotification 的事件通知

我目前正在为 Onvif 实现一个事件处理程序。但我对 WS-BaseNotification 的解组过程完全迷失了。 我如何理解/解析NotificationMessageHolderT...

回答 1 投票 0

从 XSD 解组 XML 失败,JAR 执行显示“java.io.IOException:缓冲区已关闭”

我有一个java代码,可以从PDF(Apache PDFBox)中提取Xml部分并将其解组为java类。 在使用 IntelliJ 进行本地执行时,一切正常,但是当我在 openshift 集群上部署 jar 时...

回答 1 投票 0

如何进行 asn1 marshal/unmarshal 并省略字段?

类型承载结构体{ CreatedAt time.Time `asn1:"广义"` ExpiresAt time.Time `asn1:"generalized"` 随机数字符串 签名 []byte `asn1:&qu...

回答 1 投票 0

Apache Camel 将文本文件解组为 Java 对象

文本数据文件,它显示?在那里做标记 在第 1 行固定长度记录末尾发现意外/未映射的字符 文本文件包含每个长度为 1288 的正文项目列表,当给出

回答 1 投票 0

在 Scala 中解组 protobuf

我之前已经使用 ScalaPB 和以下编组器在 Scala 中进行了解组工作: 隐式 def 编组器[T <: GeneratedMessage]: ToEntityMarshaller[T] = PredefinedToEntityMarsha...

回答 1 投票 0

未导出类型的 JSON 编组

我想使用未导出的自定义类型并定义一个接口来使用它。自定义类型将实现该接口,除了从 JSON 解组之外,一切正常。 我...

回答 1 投票 0

DynamoDB 解组当存在多个 Map 时仅解组一个 Map

我在解组从 DynamoDB 表中检索的信息时遇到问题。这是它的原始格式。 { “电子邮件”:{“S”:“[email protected]”}, &q...

回答 1 投票 0

JAXB 解组单元测试在 Eclipse 中成功,但在 gradle 测试中失败并显示“JAXB 无法处理接口”

这是一个单元测试,当我在 Eclipse 中运行它时,它可以成功运行,但当我使用 gradle 命令行“gradle test”运行它时,它会失败。 包 com.mycompany.user; 导入静态 org.junit.Assert。

回答 1 投票 0

JAXB 未将请求类转换为所需的 xml 格式

我有一个 springboot 模块,我在其中使用 @XmlRootElement(name='request') 重命名它为 api 休息调用创建的 xml 请求,但代码正在生成带有类名 ins 的请求...

回答 1 投票 0

如何在 Golang 中解码或解组嵌入的 JSON?

这是 Playground 中的示例。问题的要点是我无法解码/解组这个 名称 := "测试名称" 描述 := "测试描述" 正文 := []byte(`{...

回答 1 投票 0

Go ioutil 使用太多文件描述符/泄漏?

我正在查看文件列表,并将其中的 xml 数据解组到结构体数组 rArray 中。我打算处理大约 18000 个文件。当我处理大约 1300 个文件时,程序

回答 1 投票 0

如何将interface{}解组为int64

我有一个结构。 id 可以是字符串或数字。为了处理它,我将其类型指定为接口。 类型请求结构{ ID 接口{} `json:"id"` 代码串...

回答 1 投票 0

将结构解组为切片的通用类型定义

我有一个 API,通常将数组作为包含数组的对象返回。以下面的例子为例: { “项目”: { “数量”:3, “物品”: [ { ... } // 不是

回答 3 投票 0

将结构解组为切片的通用类型别名

我有一个 API,通常将数组作为包含数组的对象返回。以下面的例子为例: { “项目”: { “数量”:3, “物品”: [ { ... } // 不是

回答 1 投票 0

JSON 区分大小写解组结构

有没有办法让 json.Unmarshal 不接受不区分大小写的匹配?我收到一个带有“e”和“E”等标签的 JSON,并且想要解组带有标签“e”的对象,但忽略带有“e”和“E”等标签的对象...

回答 2 投票 0

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