首页 > 解决方案 > 如何在 JAVA 中读取 XML 多个标签

问题描述

我有一个存储在 String 变量中的 XML 格式。就像这样,

字符串 xml = "myXML";

    <?xml version="1.0" encoding="UTF-8"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

在上面的 XML 中,您可以看到有多个项目。有人可以告诉使用循环或其他东西,我如何将每个项目存储在 arrayList 或其他东西中?如果我可以尝试一下,我会很高兴,但不幸的是,我不知道如何去做。

感谢有人可以提供帮助吗?

请注意,XML 作为字符串存储在字符串变量中。

标签: javaxmlarraylist

解决方案


您可以创建一个 ArrayList 项目,如下面的代码:

import java.io.StringReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class Lab {

    public static Map<String,List<String>> hMap = new LinkedHashMap<>();
    public static void main(String r[]) {

        // your xml string
        String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + 
                "\r\n" + 
                "<shiporder orderid=\"889923\"\r\n" + 
                "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n" + 
                "xsi:noNamespaceSchemaLocation=\"shiporder.xsd\">\r\n" + 
                "  <orderperson>John Smith</orderperson>\r\n" + 
                "  <shipto>\r\n" + 
                "    <name>Ola Nordmann</name>\r\n" + 
                "    <address>Langgt 23</address>\r\n" + 
                "    <city>4000 Stavanger</city>\r\n" + 
                "    <country>Norway</country>\r\n" + 
                "  </shipto>\r\n" + 
                "  <item>\r\n" + 
                "    <title>Empire Burlesque</title>\r\n" + 
                "    <note>Special Edition</note>\r\n" + 
                "    <quantity>1</quantity>\r\n" + 
                "    <price>10.90</price>\r\n" + 
                "  </item>\r\n" + 
                "  <item>\r\n" + 
                "    <title>Hide your heart</title>\r\n" + 
                "    <quantity>1</quantity>\r\n" + 
                "    <price>9.90</price>\r\n" + 
                "  </item>\r\n" + 
                "</shiporder>";

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            InputSource is = new InputSource(new StringReader(s));
            Document doc = builder.parse(is);
            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getElementsByTagName("item");

            for (int parameter = 0; parameter < nodeList.getLength(); parameter++) {
                List<String> items = new ArrayList<>();
                Node node = nodeList.item(parameter);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) node;
                    String title = eElement.getElementsByTagName("title").item(0).getTextContent();
                    String quantity = eElement.getElementsByTagName("quantity").item(0).getTextContent();
                    String price = eElement.getElementsByTagName("price").item(0).getTextContent();

                    items.add(title);
                    items.add(quantity);
                    items.add(price);
                    hMap.put("item" + parameter, items);

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

        hMap.forEach((h,k) -> {
            System.out.println(h + ":" + k);    // you can get values like hMap.get("item0") and next hMap.get("item1") etc.
        });

    }

}

希望对您有所帮助。我只收集了item的共同元素。希望对你有帮助:)


推荐阅读