Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态XML标记和JAXB_Java_Xml_Jaxb - Fatal编程技术网

Java 动态XML标记和JAXB

Java 动态XML标记和JAXB,java,xml,jaxb,Java,Xml,Jaxb,考虑到不需要标记complement1、2和3,并且XML可能有complement4、5、n,我如何使用JAXB对以下XML进行序列化和反序列化 我考虑过使用@xmlanyement注释,但我需要知道值“First”属于第一个补码,“Second”属于第二个补码,等等 <resource> <id>Identifier</id> <name>Name</name> <complement1>Firs

考虑到不需要标记
complement1
2
3
,并且XML可能有
complement4
5
n
,我如何使用JAXB对以下XML进行序列化和反序列化

我考虑过使用
@xmlanyement
注释,但我需要知道值“First”属于第一个补码,“Second”属于第二个补码,等等

<resource>
    <id>Identifier</id>
    <name>Name</name>
    <complement1>First</complement1>
    <complement2>Second</complement2>
    <complement3>Third</complement3>
</resource>

标识符
名称
弗斯特
第二
第三

我相信您可以使用@xmlanyement,并且您确实可以访问元素名称。
您需要使用“任何”结构的列表。
当JAXB解组XML时,您将有一个DOM元素对象列表,每个对象都包含元素名称和内容。
我认为您必须手动强制每个元素标记名与“complementN”模式匹配

e、 g.这是根据Oracle示例之一修改的:

模式:

输出:

contents: generated.Person@1bfc93a
  firstname: David
  lastname: Francis
  any: 
    any item: [anyItem1: null]
      ele name: anyItem1
      ele text content: anyItem1Value
    any item: [anyItem2: null]
      ele name: anyItem2
      ele text content: anyItem2Value

谢谢,大卫。但这样我就必须将元素对象添加到列表中。出于可重用性的目的,我认为如果我可以创建一个类字段,例如,使用属性ordinal(int)和value(String)会更好。有一种方法可以将complementN反序列化到ComplementarField实例,并将其添加到列表中。有吗?没有,我不认为您可以这样做。根据我的经验,这个整数后缀在XML中并不常见。你能改变模式吗?例如,使标记名始终等于“complete”,并将整数后缀放在属性中?是的,我理解。这不是更好的表达这种价值观的方式。不幸的是,该XML是由另一家公司发布的REST web服务返回的。我不能修改模式,但我会向他们建议。今天,我的实现迭代了所有文档树,并手动处理这些值。谢谢你的帮助!:)
...
@XmlRootElement(name = "person")
public class Person {

    @XmlElement(required = true)
    protected String firstname;
    @XmlElement(required = true)
    protected String lastname;
    @XmlAnyElement(lax = true)
    protected List<Object> any;
...
<?xml version="1.0" encoding="utf-8"?>
<person>
  <firstname>David</firstname>
  <lastname>Francis</lastname>
  <anyItem1>anyItem1Value</anyItem1>
  <anyItem2>anyItem2Value</anyItem2>
</person>
JAXBContext jc = JAXBContext.newInstance( "generated" );
Unmarshaller u = jc.createUnmarshaller();
Person contents = (Person) u.unmarshal(Testit.class.getResource("./anysample_test1.xml"));
System.out.println("contents: " + contents);
System.out.println("  firstname: " + contents.getFirstname());
System.out.println("  lastname: " + contents.getLastname());
System.out.println("  any: ");
for (Object anyItem : contents.getAny()) {
    System.out.println("    any item: " + anyItem);
    Element ele = (Element) anyItem;
    System.out.println("      ele name: " + ele.getTagName());
    System.out.println("      ele text content: " + ele.getTextContent());
}
contents: generated.Person@1bfc93a
  firstname: David
  lastname: Francis
  any: 
    any item: [anyItem1: null]
      ele name: anyItem1
      ele text content: anyItem1Value
    any item: [anyItem2: null]
      ele name: anyItem2
      ele text content: anyItem2Value