read/parsing xml java STAX(机制)如何
how is read/parsing xml java STAX (mechanism)
我试图了解 STAX 的机制是如何工作的 java。
我有这个 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<orders>
<order created='2012-07-12T15:29:33.000' ID='2343'>
<product>
<description>Sony 54.6" (Diag) Xbr Hx929 Internet Tv</description>
<gtin>00027242816657</gtin>
<price currency="USD">2999.99</price>
<supplier>Sony</supplier>
</product>
<product>
<description>Apple iPad 2 with Wi-Fi 16GB - iOS 5 - Black</description>
<gtin>00885909464517</gtin>
<price currency="USD">399.0</price>
<supplier>Apple</supplier>
</product>
<product>
<description>Sony NWZ-E464 8GB E Series Walkman Video MP3 Player Blue</description>
<gtin>00027242831438</gtin>
<price currency="USD">91.99</price>
<supplier>Sony</supplier>
</product>
</order>
<order created='2012-07-13T16:02:22.000' ID='2344'>
<product>
<description>Apple MacBook Air A 11.6" Mac OS X v10.7 Lion MacBook</description>
<gtin>00885909464043</gtin>
<price currency="USD">1149.0</price>
<supplier>Apple</supplier>
</product>
<product>
<description>Panasonic TC-L47E50 47" Smart TV Viera E50 Series LED HDTV</description>
<gtin>00885170076471</gtin>
<price currency="USD">999.99</price>
<supplier>Panasonic</supplier>
</product>
</order>
</orders>
为了模仿这个 XML 文件的行为,我们创建了一个具有相似属性的对象
public class Product {
private int orderID;
private String createTime;
private String description;
private String gtin;
private String price;
private String supplier;
//getter and setter
}
有了这个,我试着阅读我的 xml 文件:
if (xmlEvent.isStartElement()){
StartElement startElement = xmlEvent.asStartElement();
if(startElement.getName().getLocalPart().equals("order")){
prod = new Product();
Attribute idAttr = startElement.getAttributeByName(new QName("ID"));
if(idAttr != null){
prod.setgetOrderID(Integer.parseInt(idAttr.getValue()));
}
Attribute orderTime = startElement.getAttributeByName(new QName("created"));
if(orderTime != null){
prod.setgetCreateTime(orderTime.getValue());
}
counter++;
//System.out.println("Obiect creat");
System.out.println(counter);
}
//set the other varibles from xml elements
else if(startElement.getName().getLocalPart().equals("description")){
xmlEvent = xmlEventReader.nextEvent();
prod.setDescription(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("gtin")){
xmlEvent = xmlEventReader.nextEvent();
prod.setGtin(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("price")){
xmlEvent = xmlEventReader.nextEvent();
prod.setPrice(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("supplier")){
xmlEvent = xmlEventReader.nextEvent();
prod.setSupplier(xmlEvent.asCharacters().getData());
}
我的问题是,它们是 5 个产品,但是当我尝试输出它们时,它们的数量不正确。
1. 如果在:if(startElement.getName().getLocalPart().equals("orders")) 最后一个参数在输出中是 "oders" 我只看到一个对象(Panasonic TC-L47E50 47 英寸智能电视 Viera E50 系列 LED 高清电视)
- 如果我输出的最后一个参数是 order 是 2 个对象
- 如果最后一个参数在我的输出中是 "product" 我有所有的参数,5.
我需要做什么修改才能阅读全部信息。我的范围是读取属性 "created" 和 "id" 的顺序,但使用我的所有对象,而不是 1 或 2
谢谢!
如果你正在使用 JaxB
,你不需要创建 类 甚至自己解析 XML 文件,这就是制作 JaxB 的原因为了! :)
使用 JaxB
/ Unmarshaller
和 XSD
读写 xml 的基本步骤
- 为您的
XML
结构创建一个 有效 XSD
文件。
- 将它放在您的项目文件夹中。
- 右键单击
XSD
文件和 auto-generate JAXB classes。
使用 Unmarshaller
从 XML 文件填充自动生成的 类:
Unmarshaller u = jc.createUnmarshaller();
Orders os = (Orders) u.unmarshal( new FileInputStream( "orders.xml" ) );
就是这样...JaxB 将处理 类、属性、填充、write/read xml...
我试图了解 STAX 的机制是如何工作的 java。
我有这个 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<orders>
<order created='2012-07-12T15:29:33.000' ID='2343'>
<product>
<description>Sony 54.6" (Diag) Xbr Hx929 Internet Tv</description>
<gtin>00027242816657</gtin>
<price currency="USD">2999.99</price>
<supplier>Sony</supplier>
</product>
<product>
<description>Apple iPad 2 with Wi-Fi 16GB - iOS 5 - Black</description>
<gtin>00885909464517</gtin>
<price currency="USD">399.0</price>
<supplier>Apple</supplier>
</product>
<product>
<description>Sony NWZ-E464 8GB E Series Walkman Video MP3 Player Blue</description>
<gtin>00027242831438</gtin>
<price currency="USD">91.99</price>
<supplier>Sony</supplier>
</product>
</order>
<order created='2012-07-13T16:02:22.000' ID='2344'>
<product>
<description>Apple MacBook Air A 11.6" Mac OS X v10.7 Lion MacBook</description>
<gtin>00885909464043</gtin>
<price currency="USD">1149.0</price>
<supplier>Apple</supplier>
</product>
<product>
<description>Panasonic TC-L47E50 47" Smart TV Viera E50 Series LED HDTV</description>
<gtin>00885170076471</gtin>
<price currency="USD">999.99</price>
<supplier>Panasonic</supplier>
</product>
</order>
</orders>
为了模仿这个 XML 文件的行为,我们创建了一个具有相似属性的对象
public class Product {
private int orderID;
private String createTime;
private String description;
private String gtin;
private String price;
private String supplier;
//getter and setter
}
有了这个,我试着阅读我的 xml 文件:
if (xmlEvent.isStartElement()){
StartElement startElement = xmlEvent.asStartElement();
if(startElement.getName().getLocalPart().equals("order")){
prod = new Product();
Attribute idAttr = startElement.getAttributeByName(new QName("ID"));
if(idAttr != null){
prod.setgetOrderID(Integer.parseInt(idAttr.getValue()));
}
Attribute orderTime = startElement.getAttributeByName(new QName("created"));
if(orderTime != null){
prod.setgetCreateTime(orderTime.getValue());
}
counter++;
//System.out.println("Obiect creat");
System.out.println(counter);
}
//set the other varibles from xml elements
else if(startElement.getName().getLocalPart().equals("description")){
xmlEvent = xmlEventReader.nextEvent();
prod.setDescription(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("gtin")){
xmlEvent = xmlEventReader.nextEvent();
prod.setGtin(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("price")){
xmlEvent = xmlEventReader.nextEvent();
prod.setPrice(xmlEvent.asCharacters().getData());
}else if(startElement.getName().getLocalPart().equals("supplier")){
xmlEvent = xmlEventReader.nextEvent();
prod.setSupplier(xmlEvent.asCharacters().getData());
}
我的问题是,它们是 5 个产品,但是当我尝试输出它们时,它们的数量不正确。 1. 如果在:if(startElement.getName().getLocalPart().equals("orders")) 最后一个参数在输出中是 "oders" 我只看到一个对象(Panasonic TC-L47E50 47 英寸智能电视 Viera E50 系列 LED 高清电视)
- 如果我输出的最后一个参数是 order 是 2 个对象
- 如果最后一个参数在我的输出中是 "product" 我有所有的参数,5.
我需要做什么修改才能阅读全部信息。我的范围是读取属性 "created" 和 "id" 的顺序,但使用我的所有对象,而不是 1 或 2 谢谢!
如果你正在使用 JaxB
,你不需要创建 类 甚至自己解析 XML 文件,这就是制作 JaxB 的原因为了! :)
使用 JaxB
/ Unmarshaller
和 XSD
- 为您的
XML
结构创建一个 有效XSD
文件。 - 将它放在您的项目文件夹中。
- 右键单击
XSD
文件和 auto-generate JAXB classes。 使用
Unmarshaller
从 XML 文件填充自动生成的 类:Unmarshaller u = jc.createUnmarshaller(); Orders os = (Orders) u.unmarshal( new FileInputStream( "orders.xml" ) );
就是这样...JaxB 将处理 类、属性、填充、write/read xml...