gpt4 book ai didi

java - 我如何解码具有允许在 jibx 中使用多个枚举值的属性的 XML 文档?

转载 作者:数据小太阳 更新时间:2023-10-29 02:12:07 25 4
gpt4 key购买 nike

我想使用 Jibx解码以下 XML(存储在名为 test.xml 的文件中):

<?xml version="1.0" encoding="UTF-8"?>
<rootElement attrWithEnum="avalue anothervalue" xsi:schemaLocation="my:target:ns simple.xsd" xmlns="my:target:ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</rootElement>

我这样定义了模式(在一个名为 simple.xsd 的文件中):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="my:target:ns" xmlns="my:target:ns" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="rootElement">
<xs:complexType>
<xs:attribute name="attrWithEnum" use="required">
<xs:simpleType>
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="avalue"/>
<xs:enumeration value="anothervalue"/>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

使用 org.jibx.schema.codegen.CodeGen 工具从中生成 Java 文件并编写此测试程序:

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.jibx.runtime.BindingDirectory;
import org.jibx.runtime.IBindingFactory;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;

import my.target.ns.RootElement;

public final class Program {

public static void main(final String[] args) {

try {

IBindingFactory bfact = BindingDirectory.getFactory(RootElement.class);
IUnmarshallingContext uctx = bfact.createUnmarshallingContext();
FileInputStream in = new FileInputStream(new File("test.xml"));

RootElement data = (RootElement) uctx.unmarshalDocument(in, null);

// This is not what I was expecting. I was expecting
// List<RootElement.Enumeration> (or equivalent) not
// a single RootElement.Enumeration instance
RootElement.Enumeration attrValue = data.getAttrWithEnum();

System.out.println(attrValue);

} catch (Exception e) {
System.out.println(e.toString());
}
}
}

此程序因错误而失败:

org.jibx.runtime.JiBXException: No match found for value 'avalue anothervalue' in enum class my.target.ns.RootElement$Enumeration

如果我像这样调整我的输入 XML(即只设置一个枚举值)它就可以工作(打印 AVALUE)。

<rootElement attrWithEnum="avalue" xsi:schemaLocation="my:target:ns simple.xsd" xmlns="my:target:ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

所以,jibx 似乎不喜欢我想要允许枚举值列表(我期待 getAttrWithEnum 返回一个集合,但它返回一个对象 - 请参阅上面的代码示例)。

当我使用 jaxb 时,相同的 XSD 工作正常(使用 xjc 生成 java 文件),所以我认为我的 XSD 是有效的(尽管如果有更好的方法来定义我想要的,那会很好)。

因此我的问题是:

如何在 jibx 中解码具有允许多个枚举值的属性的 XML 文档?

最佳答案

我生成了一个 RootElementxjc上课从你的模式。该字段为 attrWithEnum属性变为 List<String> attrWithEnum这会将属性中的每个单词划分为列表中的单独字符串。这将允许任何字符串值,而不仅仅是枚举中定义的字符串值。

仅将其更改为 String attrWithEnum当然会按原样存储属性。

我将类型更改为枚举:

enum AttrEnum {
avalue,
anothervalue
}
@XmlAttribute(name = "attrWithEnum", required = true)
public List<AttrEnum> attrWithEnum;

使用 JAXB(我从未使用过 Jibx),这为我提供了一个仅包含有效值的列表。枚举中未定义的属性中的任何值都将作为 null 返回值(value)。

将字段更改为 AttrEnum attrWithEnum如果属性仅包含枚举中的一个有效值,则只会返回非空值。

所以我猜你的 RootElement类定义 attrWithEnum作为一个enum而不是枚举列表 ( List<AttrEnum> )

关于java - 我如何解码具有允许在 jibx 中使用多个枚举值的属性的 XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29841219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com