Java 在解编后返回空列表
我使用了这个XSD: 这个XML: 我使用Jaxb从XSD生成Java类,创建了unmarshall方法,但每个值都返回null。请帮忙 这是我的主要课程: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
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>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="Customer" type="{}CustomerType" maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </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>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="Order" type="{}OrderType" maxOccurs="unbounded" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </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());
}