Java 无法填充列表<;项目>;从XML节点
我有一个xml文档要解析,其中包含嵌套的节点,我用自己的方式尝试过,但无法按预期完成工作。 XML文档是Java 无法填充列表<;项目>;从XML节点,java,xml,domparser,Java,Xml,Domparser,我有一个xml文档要解析,其中包含嵌套的节点,我用自己的方式尝试过,但无法按预期完成工作。 XML文档是 <Items> <Item> <MediumImage> <URL>http://ecx.images-amazon.com/images/I/51l7DDD1qNL._SL160_.jpg</URL> <Height Units="pixels">160</Height>
<Items>
<Item>
<MediumImage>
<URL>http://ecx.images-amazon.com/images/I/51l7DDD1qNL._SL160_.jpg</URL>
<Height Units="pixels">160</Height>
<Width Units="pixels">160</Width>
</MediumImage>
<Title>Fallout 4 Vault Dweller's Survival Guide Collector's Edition: Prima Official Game Guide</Title>
<OfferSummary>
<LowestNewPrice>
<Amount>1952</Amount>
</OfferSummary>
</Item>
.
.
.
</Items>
我在main()中打印为
我在main()中打印为
并使用setTitle()、setPrice()
向Item对象添加值,并返回列表
请提供任何帮助。目前,您似乎正在将价格和标题分为两个列表,如果您想将项目的价格和标题存储到单个
项目
对象中,可以执行以下操作:
public class Item {
public static void main(String[] args) {
ArrayList<Item> items = new ArrayList<Item>();
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("items.xml"));
NodeList itemElements = doc.getElementsByTagName("Item");
for (int i = 0; i < itemElements.getLength(); i++) {
Node itemElement = itemElements.item(i);
NodeList itemChildren = itemElement.getChildNodes();
Item item = new Item();
for (int j = 0; j < itemChildren.getLength(); j++) {
Node n = itemChildren.item(j);
if (n.getNodeName().equalsIgnoreCase("title")) {
item.setTitle(n.getTextContent());
} else if (n.getNodeName().equalsIgnoreCase("OfferSummary")) {
NodeList offerChildren = n.getChildNodes();
for (int k = 0; k < offerChildren.getLength(); k++) {
Node offerChild = offerChildren.item(k);
if (offerChild.getNodeName().equalsIgnoreCase("LowestNewPrice")) {
item.setPrice(offerChild.getTextContent());
}
}
}
}
items.add(item);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("items: " + items);
}
String title;
String price;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
@Override
public String toString() {
return "Title: " + title + " Price: " + price;
}
}
公共类项目{
公共静态void main(字符串[]args){
ArrayList items=新建ArrayList();
试一试{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
documentdoc=db.parse(新文件(“items.xml”);
NodeList itemElements=doc.getElementsByTagName(“项目”);
对于(int i=0;i
这样做的目的是从XML中获取所有
元素,并循环遍历它们以获取商品的标题和价格 目前,您似乎正在将价格和标题分为两个列表,如果您想将某个项目的价格和标题存储到单个项目
对象中,您可以执行以下操作:
public class Item {
public static void main(String[] args) {
ArrayList<Item> items = new ArrayList<Item>();
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("items.xml"));
NodeList itemElements = doc.getElementsByTagName("Item");
for (int i = 0; i < itemElements.getLength(); i++) {
Node itemElement = itemElements.item(i);
NodeList itemChildren = itemElement.getChildNodes();
Item item = new Item();
for (int j = 0; j < itemChildren.getLength(); j++) {
Node n = itemChildren.item(j);
if (n.getNodeName().equalsIgnoreCase("title")) {
item.setTitle(n.getTextContent());
} else if (n.getNodeName().equalsIgnoreCase("OfferSummary")) {
NodeList offerChildren = n.getChildNodes();
for (int k = 0; k < offerChildren.getLength(); k++) {
Node offerChild = offerChildren.item(k);
if (offerChild.getNodeName().equalsIgnoreCase("LowestNewPrice")) {
item.setPrice(offerChild.getTextContent());
}
}
}
}
items.add(item);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("items: " + items);
}
String title;
String price;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
@Override
public String toString() {
return "Title: " + title + " Price: " + price;
}
}
公共类项目{
公共静态void main(字符串[]args){
ArrayList items=新建ArrayList();
试一试{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
documentdoc=db.parse(新文件(“items.xml”);
NodeList itemElements=doc.getElementsByTagName(“项目”);
对于(int i=0;i
这样做的目的是从XML中获取所有
元素,并循环遍历它们以获取商品的标题和价格 您可以试试这个解决方案。
解析数据并添加到列表中,如下所示:
public static Document fetchRequiredData(String src) {
Document doc = null;
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser;
try {
parser = dbFactory.newDocumentBuilder();
doc= parser.parse(src);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return doc;
}
public static List<Item> parseItemInfo(Document doc){
List<Item> items = new ArrayList<Item>();
NodeList itemNodeList = doc.getElementsByTagName("Item");
for (int i = 0; i < itemNodeList.getLength(); i++) {
Node titleNode = doc.getElementsByTagName("Title").item(i);
Node priceNode = doc.getElementsByTagName("LowestNewPrice").item(i).getFirstChild();
if (titleNode.getNodeType() == Node.ELEMENT_NODE || priceNode.getNodeType() == Node.ELEMENT_NODE ) {
Item item = new Item();
item.setDesc(titleNode.getTextContent());
item.setPrice(priceNode.getTextContent());
items.add(item);
}
}
return items;
}
希望这个有帮助。您可以试试这个解决方案。
解析数据并添加到列表中,如下所示:
public static Document fetchRequiredData(String src) {
Document doc = null;
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser;
try {
parser = dbFactory.newDocumentBuilder();
doc= parser.parse(src);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return doc;
}
public static List<Item> parseItemInfo(Document doc){
List<Item> items = new ArrayList<Item>();
NodeList itemNodeList = doc.getElementsByTagName("Item");
for (int i = 0; i < itemNodeList.getLength(); i++) {
Node titleNode = doc.getElementsByTagName("Title").item(i);
Node priceNode = doc.getElementsByTagName("LowestNewPrice").item(i).getFirstChild();
if (titleNode.getNodeType() == Node.ELEMENT_NODE || priceNode.getNodeType() == Node.ELEMENT_NODE ) {
Item item = new Item();
item.setDesc(titleNode.getTextContent());
item.setPrice(priceNode.getTextContent());
items.add(item);
}
}
return items;
}
希望这个有帮助。您可以通过使用JAXBContext实现这一点。首先创建Item类
@XmlRootElement(name = "Items")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Items
{
@XmlElement(name = "Item")
private List<Item> item;
public void setItem(List<Item> itemList)
{
this.item = itemList;
}
public List<Item> getItem()
{
return this.item;
}
}
@XmlRootElement(name = "Item")
@XmlAccessorType(vallue = XmlAccessType.FIELD)
public class Item
{
@XmlElement(name = "MediumImage")
private MediumImage image;
@XmlElement(name = "Title")
private String title;
@XmlElement(name = "OfferSummary")
private OfferSummary summary;
getters();
setters();
}
@XmlRootElement(name = "MediumImage")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class MediumImage
{
@XmlElement(name = "URL")
private String url;
....
}
@XmlRootElement(name = "OfferSummary")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class OfferSummary
{
@XmlElement(name = "LowestNewPrice")
private LowestNewPrice lowestPrice;
....
}
您可以通过使用JAXBContext来实现这一点。首先创建Item类
@XmlRootElement(name = "Items")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Items
{
@XmlElement(name = "Item")
private List<Item> item;
public void setItem(List<Item> itemList)
{
this.item = itemList;
}
public List<Item> getItem()
{
return this.item;
}
}
@XmlRootElement(name = "Item")
@XmlAccessorType(vallue = XmlAccessType.FIELD)
public class Item
{
@XmlElement(name = "MediumImage")
private MediumImage image;
@XmlElement(name = "Title")
private String title;
@XmlElement(name = "OfferSummary")
private OfferSummary summary;
getters();
setters();
}
@XmlRootElement(name = "MediumImage")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class MediumImage
{
@XmlElement(name = "URL")
private String url;
....
}
@XmlRootElement(name = "OfferSummary")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class OfferSummary
{
@XmlElement(name = "LowestNewPrice")
private LowestNewPrice lowestPrice;
....
}
这是一种有效的方法,但是如果有
元素没有
或
元素,它就会失败。正如上面讨论的xml存根所提供的,我想在
元素没有
或
元素的情况下,这种情况不太可能发生。谢谢你的考虑,但是上面的答案可以改进以避免这种情况,我认为这个答案是ea
public static Document fetchRequiredData(String src) {
Document doc = null;
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser;
try {
parser = dbFactory.newDocumentBuilder();
doc= parser.parse(src);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return doc;
}
public static List<Item> parseItemInfo(Document doc){
List<Item> items = new ArrayList<Item>();
NodeList itemNodeList = doc.getElementsByTagName("Item");
for (int i = 0; i < itemNodeList.getLength(); i++) {
Node titleNode = doc.getElementsByTagName("Title").item(i);
Node priceNode = doc.getElementsByTagName("LowestNewPrice").item(i).getFirstChild();
if (titleNode.getNodeType() == Node.ELEMENT_NODE || priceNode.getNodeType() == Node.ELEMENT_NODE ) {
Item item = new Item();
item.setDesc(titleNode.getTextContent());
item.setPrice(priceNode.getTextContent());
items.add(item);
}
}
return items;
}
public static void main(String[] args) {
List<Item> items = parseItemInfo(fetchRequiredData(requestUrl));
System.out.println("Printing List<Item> contents ...");
for (Item item : items) {
System.out.println("Title is " + item.getTitle());
System.out.println("Price is " + item.getPrice());
System.out.println();
}
}
@XmlRootElement(name = "Items")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Items
{
@XmlElement(name = "Item")
private List<Item> item;
public void setItem(List<Item> itemList)
{
this.item = itemList;
}
public List<Item> getItem()
{
return this.item;
}
}
@XmlRootElement(name = "Item")
@XmlAccessorType(vallue = XmlAccessType.FIELD)
public class Item
{
@XmlElement(name = "MediumImage")
private MediumImage image;
@XmlElement(name = "Title")
private String title;
@XmlElement(name = "OfferSummary")
private OfferSummary summary;
getters();
setters();
}
@XmlRootElement(name = "MediumImage")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class MediumImage
{
@XmlElement(name = "URL")
private String url;
....
}
@XmlRootElement(name = "OfferSummary")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class OfferSummary
{
@XmlElement(name = "LowestNewPrice")
private LowestNewPrice lowestPrice;
....
}
public static void main(String[] args)
{
File xmlFile = new File("file path");
JAXBContext context = JAXBContext.newInstance(Items.class);
//To get POJO from xml
Unmarshaller unmarshaller = context.createUnmarshaller();
Items items = (Items) unmarshaller.unmarshal(xmlFile);
}