Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
使用Jaxb库Java从xml文件返回映射_Java_Xml_Jaxb_Pojo - Fatal编程技术网

使用Jaxb库Java从xml文件返回映射

使用Jaxb库Java从xml文件返回映射,java,xml,jaxb,pojo,Java,Xml,Jaxb,Pojo,我试图直接从XML文件返回映射。我通过创建一个自定义适配器来尝试,但问题是这个适配器没有从XML接收带有值的输入参数 以下是问题的截图供参考 下面是我试图解析的XML <?xml version="1.0" encoding="utf-8" standalone="yes"?> <GroupRoot> <Root> <Group> <

我试图直接从XML文件返回映射。我通过创建一个自定义适配器来尝试,但问题是这个适配器没有从XML接收带有值的输入参数

以下是问题的截图供参考

下面是我试图解析的XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<GroupRoot>
    <Root>
        <Group>
            <UUID>ahsdlfkjadslkfjalkdsjflakjdslf</UUID>
            <Name>Root Group 1</Name>
            <Entry>
                <UUID>1212135454==</UUID>
                <String>
                    <Key>Notes</Key>
                    <Value>Notes from Manager</Value>
                </String>
                <String>
                    <Key>Item1</Key>
                    <Value>Item1Value</Value>
                </String>
                <String>
                    <Key>Item2</Key>
                    <Value>Item2Value</Value>
                </String>
                <String>
                    <Key>Item3</Key>
                    <Value>Item3Value</Value>
                </String>
                <String>
                    <Key>Item4</Key>
                    <Value>Item4Value</Value>
                </String>
            </Entry>
            <Entry>
                <UUID>45645466546546464==</UUID>
                <String>
                    <Key>Notes</Key>
                    <Value>Notes from Manager</Value>
                </String>
                <String>
                    <Key>Item1</Key>
                    <Value>Item1Value1</Value>
                </String>
                <String>
                    <Key>Item2</Key>
                    <Value>Item2Value1</Value>
                </String>
                <String>
                    <Key>Item3</Key>
                    <Value>Item3Value1</Value>
                </String>
                <String>
                    <Key>Item4</Key>
                    <Value>Item4Value1</Value>
                </String>
            </Entry>
        </Group>
    </Root>
</GroupRoot>

我不知道是否可以在xs:sequence上使用XmlAdapter。我在
Entry
元素上成功地将XmlAdapter设置了一个级别:

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

public class Test {
  public static void main(String[] args) throws Exception {
    Root root = (Root) JAXBContext.newInstance(Root.class).createUnmarshaller().unmarshal(new File("test.xml"));
    System.out.println("" + root.entryList.get(0).map);
    System.out.println("" + root.entryList.get(1).map);
  }
}

@XmlRootElement(name = "Root")
class Root {
  @XmlElement(name = "Entry")
  public List<Entry> entryList = new ArrayList<>();
}

@XmlJavaTypeAdapter(EntryAdapter.class)
class Entry {
  public String              uuid;
  public Map<String, String> map = new TreeMap<>();
}

class EntryMappableByJaxb {
  @XmlElement
  public String         UUID;
  @XmlElement(name = "String")
  public List<KeyValue> stringList = new ArrayList<>();
}

class KeyValue {
  @XmlElement
  public String Key;
  @XmlElement
  public String Value;
}

class EntryAdapter extends XmlAdapter<EntryMappableByJaxb, Entry> {
  @Override
  public Entry unmarshal(EntryMappableByJaxb entryMappableByJaxb) throws Exception {
    Entry entry = new Entry();
    entry.uuid = entryMappableByJaxb.UUID;
    entryMappableByJaxb.stringList.forEach(i -> entry.map.put(i.Key, i.Value));
    return entry;
  }

  @Override
  public EntryMappableByJaxb marshal(Entry v) throws Exception {
    return null;
  }
}
导入java.io.File;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Map;
导入java.util.TreeMap;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
公开课考试{
公共静态void main(字符串[]args)引发异常{
Root=(Root)JAXBContext.newInstance(Root.class).createUnmarshaller().unmarshal(新文件(“test.xml”);
System.out.println(“+root.entryList.get(0.map));
System.out.println(“+root.entryList.get(1.map));
}
}
@XmlRootElement(name=“Root”)
类根{
@xmlement(name=“Entry”)
public List entryList=new ArrayList();
}
@XmlJavaTypeAdapter(EntryAdapter.class)
班级报名{
公共字符串uuid;
publicmap=newtreemap();
}
类EntryMappableByJaxb{
@XmlElement
公共字符串UUID;
@xmlement(name=“String”)
public List stringList=new ArrayList();
}
类键值{
@XmlElement
公共字符串密钥;
@XmlElement
公共字符串值;
}
类EntryAdapter扩展了XmlAdapter{
@凌驾
公共条目解组(EntryMappableByJaxb EntryMappableByJaxb)引发异常{
条目=新条目();
entry.uuid=entryMappableByJaxb.uuid;
entryMappableByJaxb.stringList.forEach(i->entry.map.put(i.Key,i.Value));
返回条目;
}
@凌驾
public entrymappablejaxb封送(条目v)引发异常{
返回null;
}
}
使用的测试XML:

<Root>
  <Entry>
    <UUID>uuid 1</UUID>
    <String>
      <Key>1.1</Key>
      <Value>value 1.1</Value>
    </String>
    <String>
      <Key>1.2</Key>
      <Value>value 1.2</Value>
    </String>
  </Entry>
  <Entry>
    <UUID>uuid 2</UUID>
    <String>
      <Key>2.1</Key>
      <Value>value 2.1</Value>
    </String>
    <String>
      <Key>2.2</Key>
      <Value>value 2.2</Value>
    </String>
  </Entry>
</Root>

uuid 1
1.1
价值1.1
1.2
价值1.2
uuid 2
2.1
价值2.1
2.2
价值2.2
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

public class Test {
  public static void main(String[] args) throws Exception {
    Root root = (Root) JAXBContext.newInstance(Root.class).createUnmarshaller().unmarshal(new File("test.xml"));
    System.out.println("" + root.entryList.get(0).map);
    System.out.println("" + root.entryList.get(1).map);
  }
}

@XmlRootElement(name = "Root")
class Root {
  @XmlElement(name = "Entry")
  public List<Entry> entryList = new ArrayList<>();
}

@XmlJavaTypeAdapter(EntryAdapter.class)
class Entry {
  public String              uuid;
  public Map<String, String> map = new TreeMap<>();
}

class EntryMappableByJaxb {
  @XmlElement
  public String         UUID;
  @XmlElement(name = "String")
  public List<KeyValue> stringList = new ArrayList<>();
}

class KeyValue {
  @XmlElement
  public String Key;
  @XmlElement
  public String Value;
}

class EntryAdapter extends XmlAdapter<EntryMappableByJaxb, Entry> {
  @Override
  public Entry unmarshal(EntryMappableByJaxb entryMappableByJaxb) throws Exception {
    Entry entry = new Entry();
    entry.uuid = entryMappableByJaxb.UUID;
    entryMappableByJaxb.stringList.forEach(i -> entry.map.put(i.Key, i.Value));
    return entry;
  }

  @Override
  public EntryMappableByJaxb marshal(Entry v) throws Exception {
    return null;
  }
}
<Root>
  <Entry>
    <UUID>uuid 1</UUID>
    <String>
      <Key>1.1</Key>
      <Value>value 1.1</Value>
    </String>
    <String>
      <Key>1.2</Key>
      <Value>value 1.2</Value>
    </String>
  </Entry>
  <Entry>
    <UUID>uuid 2</UUID>
    <String>
      <Key>2.1</Key>
      <Value>value 2.1</Value>
    </String>
    <String>
      <Key>2.2</Key>
      <Value>value 2.2</Value>
    </String>
  </Entry>
</Root>