Java 无法填充列表<;项目>;从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>

我有一个xml文档要解析,其中包含嵌套的节点,我用自己的方式尝试过,但无法按预期完成工作。 XML文档是

<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);
}