【问题标题】:DOM XML Parser ExampleDOM XML 解析器示例
【发布时间】:2013-10-16 06:44:59
【问题描述】:

我有这个 XML 文件。我只是解析这个 XML 文件。这个例子展示了如何通过“名称”获取节点,并显示值。如何显示数据库中的所有记录?

<data399173_eff_sor>
<record>
    <ID>1</ID>
    <item_no>1.0</item_no>
    <description>Hack off tiles and make good walls</description>
    <price>100</price>
    <base_qty>50</base_qty>
    <var_qty>20</var_qty>
    <base_price_>5000</base_price_>   
</record>
<record>
    <ID>1</ID>
    <item_no>1.03</item_no>
    <description>Test</description>
    <price>45</price>
    <base_qty>100</base_qty>
    <var_qty>4500</var_qty>
    <base_price_>0</base_price_>
</record>
</data399173_eff_sor>

等等

Java 代码

   File fXmlFile = new File("D:/formdata.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);

    doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

    NodeList nList = doc.getElementsByTagName("record");

    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) {

        Node nNode = nList.item(temp);

        System.out.println("\nCurrent Element :" + nNode.getNodeName());

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {

            Element eElement = (Element) nNode;

            System.out.println("Item No : " + eElement.getElementsByTagName("item_no").item(0).getTextContent());
            System.out.println("Description : " + eElement.getElementsByTagName("description").item(0).getTextContent());
            System.out.println("price : " + eElement.getElementsByTagName("price").item(0).getTextContent());
            System.out.println("base qty : " + eElement.getElementsByTagName("base_qty").item(0).getTextContent());
            System.out.println("Var qty : " + eElement.getElementsByTagName("var_qty").item(0).getTextContent());
            System.out.println("Base price : " + eElement.getElementsByTagName("base_price_").item(0).getTextContent());                

        }

这里只显示第一条记录。我想显示数据库中的所有记录

【问题讨论】:

  • 我编辑了我的 XML 文件。现在这是我从服务器下载的原始文件

标签: java xml


【解决方案1】:

xml 无效。 (您可以在线验证您的 xml:http://www.w3schools.com/xml/xml_validator.asp)

你可以试试这个xml

<records>
 <record>
  <ID>1</ID>
  <item_no>1.0</item_no>
  <description>Hack off tiles and make good walls</description>
  <price>100</price>
  <base_qty>50</base_qty>
  <var_qty>20</var_qty>
  <base_price_>5000</base_price_>   
 </record>
 <record>
  <ID>1</ID>
  <item_no>1.03</item_no>
  <description>Test</description>
  <price>45</price>
  <base_qty>100</base_qty>
  <var_qty>4500</var_qty>
  <base_price_>0</base_price_>
 </record>
</records>

并保留您的代码

package test;

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

import java.io.File;
import java.io.IOException;

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


public class TestXml{ 
 public static void main (String[] args) throws ParserConfigurationException{
     TestXml t = new TestXml();
     t.readXml() ;
   } 
 public void readXml () throws ParserConfigurationException{
    File fXmlFile = new File("D:/formdata.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = null;
    try {
        doc = dBuilder.parse(fXmlFile);
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

    NodeList nList = doc.getElementsByTagName("record");

    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) {

        Node nNode = nList.item(temp);

        System.out.println("\nCurrent Element :" + nNode.getNodeName());

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {

            Element eElement = (Element) nNode;

            System.out.println("Item No : " + eElement.getElementsByTagName("item_no").item(0).getTextContent());
            System.out.println("Description : " + eElement.getElementsByTagName("description").item(0).getTextContent());
            System.out.println("price : " + eElement.getElementsByTagName("price").item(0).getTextContent());
            System.out.println("base qty : " + eElement.getElementsByTagName("base_qty").item(0).getTextContent());
            System.out.println("Var qty : " + eElement.getElementsByTagName("var_qty").item(0).getTextContent());
            System.out.println("Base price : " + eElement.getElementsByTagName("base_price_").item(0).getTextContent());                

        }}}}

你会得到这个结果

Root element :records
----------------------------

Current Element :record
Item No : 1.0
Description : Hack off tiles and make good walls
price : 100
base qty : 50
Var qty : 20
Base price : 5000

Current Element :record
Item No : 1.03
Description : Test
price : 45
base qty : 100
Var qty : 4500
Base price : 0

【讨论】:

  • 我试试这个,但输出是一样的
  • 我尝试使用您的新 xml 并且它正在工作。你可以试试我发布的java代码并显示结果吗?
  • 是的,我试过你的代码。它给出以下输出。根元素:_data399173_eff_sor ---------------------------- 当前元素:记录 项目编号:1.0 描述:砍掉瓷砖并制作好的墙壁价格: 100 基础数量 : 50 Var 数量 : 20 基础价格 : 5000 货号 : 1.01 描述 : 淋浴区分隔地板 ( 熨平板或木材 价格 : 4 基础数量 : 1000 Var 数量 : 0 基础价格 : 4000
  • 您正在尝试使用另一个xml文件,请先尝试验证它。
【解决方案2】:

我认为您的 XML 无效——您只能在 XML 中拥有一个根元素。

所以当你这样做时:

NodeList nList = doc.getElementsByTagName("record");

你只会得到一个元素。这是第一个&lt;record&gt;...&lt;/record&gt;

为了解决这个问题,您需要将所有&lt;record&gt; 标签包装在某种根元素中,如下所示:

<root>
  <record>
    <id>1</id>
  </record>
  <record>
    <id>2</id>
  </record>
  ...
</root>

你必须说:

NodeList nList = doc.getDocumentElement().getElementsByTagName("record");

【讨论】:

  • No.NodeList nList = doc.getElementsByTagName("record") 表示它只处理记录元素
【解决方案3】:

您可以在循环中尝试此代码。

Node nNode = nList.item(temp);
NodeList list = nNode.getChildNodes();
list.item(0).getTextContent();

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 2012-01-29
    • 2013-07-24
    • 1970-01-01
    • 2011-11-01
    • 2010-11-24
    • 2010-12-25
    • 2013-01-31
    • 2013-07-18
    相关资源
    最近更新 更多