有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JAXB与XML属性的解组问题

我在用JAXB解组XML文件时遇到了一个问题。在一些xml元素上有一个名为“display_value”的属性,我需要获取该属性。以下是XML文件的一个小示例:

<unload>
  <change_request>
    <active>true</active>
    <approval>not requested</approval>
    <assigned_to display_value=""/>
    <alt_poc display_value="Tom Ford">056468745677484657</alt_poc>
    <poc display_value="Matt Ryan">56465148754878</poc>
   </change_request>
</unload>

我假设在我的ChangeRequest类中,我只需在具有该属性的display_值的字段上注释@XmlAttribute(name=“display_value”),例如alt_poc,但这似乎不起作用

@XmlAccessorType(XmlAccessType.FIELD)
public class ChangeRequest{
  String active;
  String approval;
  String assigned_to;
  String alt_poc;
  String poc;
}

我有一个类,它包含一个ChangeRequest对象列表,称为ChangeRequests。该类很简单,如下所示:

@XmlRootElement(name="unload")
public class ChangeRequests{
ArrayList<ChangeRequest> changeRequestList;

@XmlElement(name="change_request")
public ArrayList<ChangeRequest> getRecords(){
  return changeRequestList;
}

最后,我将向您展示执行所有这些操作的JAXB代码

URL url = new URL("wwww.somethingInteresting.com/syz.xml");
try {
   JAXBConext jc = JAXBContext.newInstance(ChangeRequest.class, ChangeRequests.class);
   Unmarshaller un  = jc.createUnmarshaller();

   return (ChangeRequests) un.unmarshal(url);
} catch(JAXBException e){
    thow new RunTimeException(e);
}

目前,所有的代码都可以工作,但是我无法在需要时获得display_值。我得到的不是显示值,而是像65484435487这样的长数字

任何人能提供的任何帮助都将是巨大的。谢谢大家!


共 (1) 个答案

  1. # 1 楼答案

    您需要为每个具有XML属性的元素创建单独的类,不能在ChangeRequest类上定义display_值。下面是一个例子

    首先,我从示例XML生成了一个XSD:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="unload" type="unloadType"/>
      <xs:complexType name="alt_pocType">
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute type="xs:string" name="display_value"/>
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
      <xs:complexType name="change_requestType">
        <xs:sequence>
          <xs:element type="xs:string" name="active"/>
          <xs:element type="xs:string" name="approval"/>
          <xs:element type="assigned_toType" name="assigned_to"/>
          <xs:element type="alt_pocType" name="alt_poc"/>
          <xs:element type="pocType" name="poc"/>
        </xs:sequence>
      </xs:complexType>
      <xs:complexType name="assigned_toType">
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute type="xs:string" name="display_value"/>
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
      <xs:complexType name="pocType">
        <xs:simpleContent>
          <xs:extension base="xs:string">
            <xs:attribute type="xs:string" name="display_value"/>
          </xs:extension>
        </xs:simpleContent>
      </xs:complexType>
      <xs:complexType name="unloadType">
        <xs:sequence>
          <xs:element type="change_requestType" name="change_request"/>
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    

    然后我从这个XSD生成了JAXB类。以下是ChangeRequestType:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "change_requestType", propOrder = {
        "active",
        "approval",
        "assignedTo",
        "altPoc",
        "poc"
    })
    public class ChangeRequestType {
    
        @XmlElement(required = true)
        protected String active;
        @XmlElement(required = true)
        protected String approval;
        @XmlElement(name = "assigned_to", required = true)
        protected AssignedToType assignedTo;
        @XmlElement(name = "alt_poc", required = true)
        protected AltPocType altPoc;
        @XmlElement(required = true)
        protected PocType poc;
    
      // Getters and setters follow
    }
    

    例如,这里是AssignedToType。请注意,必须在此处定义显示值:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "assigned_toType", propOrder = {
            "value"
        })
        public class AssignedToType {
    
            @XmlValue
            protected String value;
            @XmlAttribute(name = "display_value")
            protected String displayValue;
    
            // Getters and setters follow
    }