Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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/15.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 在解编后返回空列表_Java_Xml_Unmarshalling_Jaxb2 - Fatal编程技术网

Java 在解编后返回空列表

Java 在解编后返回空列表,java,xml,unmarshalling,jaxb2,Java,Xml,Unmarshalling,Jaxb2,我使用了这个XSD: 这个XML: 我使用Jaxb从XSD生成Java类,创建了unmarshall方法,但每个值都返回null。请帮忙 这是我的主要课程: try { SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema xsdSchema = sf.newSchema(new File(%Here is

我使用了这个XSD:

这个XML:

我使用Jaxb从XSD生成Java类,创建了unmarshall方法,但每个值都返回null。请帮忙

这是我的主要课程:

        try {

            SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema xsdSchema = sf.newSchema(new File(%Here is the PATH% \\CustomerAndOrders.xsd"));

            JAXBContext jc = JAXBContext.newInstance(Root.class);

            Unmarshaller unmarshaller = jc.createUnmarshaller();
            unmarshaller.setSchema(xsdSchema);
            unmarshaller.setEventHandler(new MyValidationEventHandler());
            File file = new File("%Here is the PATH% \\ XMLTestFile.xml");
            System.out.println(file.getName());

            Root root = (Root) unmarshaller.unmarshal(file);
            CustomerType orderT = new CustomerType();
            Customers cust = new Customers();

            for (CustomerType cT : cust.getCustomer()) {
                System.out.println(cT.getContactName());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static class MyValidationEventHandler implements ValidationEventHandler {

        public boolean handleEvent(ValidationEvent event) {
            System.out.println("\nEVENT");
            System.out.println("SEVERITY:  " + event.getSeverity());
            System.out.println("MESSAGE:  " + event.getMessage());
            System.out.println("LINKED EXCEPTION:  " + event.getLinkedException());
            System.out.println("LOCATOR");
            System.out.println("    LINE NUMBER:  " + event.getLocator().getLineNumber());
            System.out.println("    COLUMN NUMBER:  " + event.getLocator().getColumnNumber());
            System.out.println("    OFFSET:  " + event.getLocator().getOffset());
            System.out.println("    OBJECT:  " + event.getLocator().getObject());
            System.out.println("    NODE:  " + event.getLocator().getNode());
            System.out.println("    URL:  " + event.getLocator().getURL());
            return true;
        }

    }
使用Jaxb生成的类:

package XMLBeans;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "customers",
    "orders"
})
@XmlRootElement(name = "Root")
public class Root {

    @XmlElement(name = "Customers", required = true)
    protected Root.Customers customers;
    @XmlElement(name = "Orders", required = true)
    protected Root.Orders orders;

    /**
     * Gets the value of the customers property.
     * 
     * @return
     *     possible object is
     *     {@link Root.Customers }
     *     
     */
    public Root.Customers getCustomers() {
        return customers;
    }

    /**
     * Sets the value of the customers property.
     * 
     * @param value
     *     allowed object is
     *     {@link Root.Customers }
     *     
     */
    public void setCustomers(Root.Customers value) {
        this.customers = value;
    }

    /**
     * Gets the value of the orders property.
     * 
     * @return
     *     possible object is
     *     {@link Root.Orders }
     *     
     */
    public Root.Orders getOrders() {
        return orders;
    }

    /**
     * Sets the value of the orders property.
     * 
     * @param value
     *     allowed object is
     *     {@link Root.Orders }
     *     
     */
    public void setOrders(Root.Orders value) {
        this.orders = value;
    }


    /**
     * <p>Java class for anonymous complex type.
     * 
     * <p>The following schema fragment specifies the expected content contained within this class.
     * 
     * <pre>
     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="Customer" type="{}CustomerType" maxOccurs="unbounded" minOccurs="0"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "customer"
    })
    public static class Customers {

        @XmlElement(name = "Customer")
        protected List<CustomerType> customer;

        public List<CustomerType> getCustomer() {
            if (customer == null) {
                customer = new ArrayList<CustomerType>();
            }
            return this.customer;
        }

    }


    /**
     * <p>Java class for anonymous complex type.
     * 
     * <p>The following schema fragment specifies the expected content contained within this class.
     * 
     * <pre>
     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="Order" type="{}OrderType" maxOccurs="unbounded" minOccurs="0"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "order"
    })
    public static class Orders {

        @XmlElement(name = "Order")
        protected List<OrderType> order;

        /**
         * Gets the value of the order property.
         * 
         * <p>
         * This accessor method returns a reference to the live list,
         * not a snapshot. Therefore any modification you make to the
         * returned list will be present inside the JAXB object.
         * This is why there is not a <CODE>set</CODE> method for the order property.
         * 
         * <p>
         * For example, to add a new item, do as follows:
         * <pre>
         *    getOrder().add(newItem);
         * </pre>
         * 
         * 
         * <p>
         * Objects of the following type(s) are allowed in the list
         * {@link OrderType }
         * 
         * 
         */
        public List<OrderType> getOrder() {
            if (order == null) {
                order = new ArrayList<OrderType>();
            }
            return this.order;
        }

    }

}
* * * *列表中允许以下类型的对象 *{@link OrderType} * * */ 公共列表getOrder(){ if(order==null){ 订单=新的ArrayList(); } 退回此订单; } } } CustomerType类

Root root = (Root) unmarshaller.unmarshal(file);
for (CustomerType cT : root.getCustomers.getCustomer()) {
    System.out.println(cT.getContactName());
}
以下是我的示例XML:


五大湖食品市场
霍华德·斯奈德
市场经理
(503) 555-7555  
贝克大道2732号。
尤金
或
97403
美国
灰色的
6.
1997-05-06T00:00:00
1997-05-20T00:00:00
2.
3.35
五大湖食品市场
贝克大道2732号。
尤金
或
97403
美国
莱茨
4.
1998-02-12T00:00:00
1998-03-12T00:00:00
2.
90.97
让我们停下来买东西吧
波尔克街87号5号套房
旧金山
加利福尼亚州
94117
美国

在注释
@XmlType
的参数
name
下,您为客户生成的JAXB类被命名为
CustomerType
,但在您提供的xml上,单个客户标记被简单命名为
customer

将java类中的任何声明从
CustomerType
更改为
Customer

编辑: 通过阅读XSD文件,我发现它与XML文件的有效内容不一致:所以我想知道还有什么东西可能被破坏了

编辑2: 正如您在注释中所述,在进行上述更改后,您可以正确地取消对xml文件的整理,但是无法检索for each循环中的数据:这是因为一个非常简单的问题:您正在迭代
cust
,它被分配为
Customers
的全新实例,并且与
root
中有效未封送的内容无关。 因此,请通过更改以下内容重构主类的代码:

致:


嗨,卡图罗斯!声明更改不起作用!在调试模式下,我看到了这些值,但CustomerType上的for each不起作用,无法输入列表。因此,您可以在Root、Customers和CustomerType实例中取消整理xml的所有内容,但当您尝试访问CustomerType实例中的CustomerType列表时,无法获取内容,你是这么说的吗?在按照我的建议更改声明之后,您是否能够取消封送xml提要的内容?第一个问题:是的,第二个问题:YesKatuiros!非常感谢。
<?xml version="1.0" encoding="utf-8"?>  
<Root>  
  <Customers>  
    <Customer CustomerID="GREAL">  
      <CompanyName>Great Lakes Food Market</CompanyName>  
      <ContactName>Howard Snyder</ContactName>  
      <ContactTitle>Marketing Manager</ContactTitle>  
      <Phone>(503) 555-7555</Phone>  
      <FullAddress>  
        <Address>2732 Baker Blvd.</Address>  
        <City>Eugene</City>  
        <Region>OR</Region>  
        <PostalCode>97403</PostalCode>  
        <Country>USA</Country>  
      </FullAddress>  
    </Customer>  
  </Customers>  
  <Orders>  
    <Order>  
      <CustomerID>GREAL</CustomerID>  
      <EmployeeID>6</EmployeeID>  
      <OrderDate>1997-05-06T00:00:00</OrderDate>  
      <RequiredDate>1997-05-20T00:00:00</RequiredDate>  
      <ShipInfo ShippedDate="1997-05-09T00:00:00">  
        <ShipVia>2</ShipVia>  
        <Freight>3.35</Freight>  
        <ShipName>Great Lakes Food Market</ShipName>  
        <ShipAddress>2732 Baker Blvd.</ShipAddress>  
        <ShipCity>Eugene</ShipCity>  
        <ShipRegion>OR</ShipRegion>  
        <ShipPostalCode>97403</ShipPostalCode>  
        <ShipCountry>USA</ShipCountry>  
      </ShipInfo>  
    </Order>   
    <Order>  
      <CustomerID>LETSS</CustomerID>  
      <EmployeeID>4</EmployeeID>  
      <OrderDate>1998-02-12T00:00:00</OrderDate>  
      <RequiredDate>1998-03-12T00:00:00</RequiredDate>  
      <ShipInfo ShippedDate="1998-02-13T00:00:00">  
        <ShipVia>2</ShipVia>  
        <Freight>90.97</Freight>  
        <ShipName>Let's Stop N Shop</ShipName>  
        <ShipAddress>87 Polk St. Suite 5</ShipAddress>  
        <ShipCity>San Francisco</ShipCity>  
        <ShipRegion>CA</ShipRegion>  
        <ShipPostalCode>94117</ShipPostalCode>  
        <ShipCountry>USA</ShipCountry>  
      </ShipInfo>  
    </Order>  
  </Orders>  
</Root>
Root root = (Root) unmarshaller.unmarshal(file);
CustomerType orderT = new CustomerType();
Customers cust = new Customers();
for (CustomerType cT : cust.getCustomer()) {
    System.out.println(cT.getContactName());
}
Root root = (Root) unmarshaller.unmarshal(file);
for (CustomerType cT : root.getCustomers.getCustomer()) {
    System.out.println(cT.getContactName());
}