以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  [求助]关于利用dom解析xml的简单问题,希望高手们看看!!  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=35328)


--  作者:piebila
--  发布时间:7/7/2006 3:49:00 PM

--  [求助]关于利用dom解析xml的简单问题,希望高手们看看!!
本菜鸟编写了一个非常简单的解析xml的程序,但出现了一些问题,希望高手们多多帮忙指点!

xml文档如下:

<?xml version="1.0" ?>
<customers>
  <customer >
    <id ref="pjl"/>
    <name dd="dd"/>
    <address ee="ds"/>
  </customer>
  <customer>
    <id ref="jjj">#002</id>
    <name dd="dd">Car</name>
    <address ee="dd">Suzhou</address>
  </customer>
  <customer>
    <id ref="ww">#003</id>
    <name dd="ee">Jimmy</name>
    <address ee="rr">ChengDu</address>
  </customer>
  <customer>
    <id ref="ww">#004</id>
    <name dd="r">Henry</name>
    <address ee="hh">Xi'an</address>
  </customer>
</customers>


程序如下,错误出处已标在程序中:

import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

public class Saveadds extends Object{
  public static void main(String args[]) {
    String addsFile="adds.xml";
    Document addsDoc = null;
    try {
      DocumentBuilderFactory docbuilderfactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder docbuilder = docbuilderfactory.newDocumentBuilder();
      addsDoc = docbuilder.parse(addsFile);
      Element addsRoot=addsDoc.getDocumentElement();
      NodeList Address=addsRoot.getElementsByTagName("customer");
      for (int i=0;i<Address.getLength();i++){
             Element cntAddress = (Element)Address.item(i);
             String id= cntAddress.getElementsByTagName("id").item(0).getFirstChild().getNodeValue();
             System.out.println(id);
             String refattri=cntAddress.getAttribute("ref");
             System.out.println(refattri);
           /**就是上面两行,其实就是抽取并输出元素中的属性。下面还有几行相似的代码。如果不写它们,程序执行没问题,但只要有它

们,就出现“Cannot read the addsfile:null”的错误**/
             String name=cntAddress.getElementsByTagName("name").item(0).getFirstChild().getNodeValue();
             System.out.println(name);
             String ddattri=cntAddress.getAttribute("dd");
             System.out.println(ddattri);
             String address = cntAddress.getElementsByTagName("address").item(0).getFirstChild().getNodeValue();
             System.out.println(address);
             String eeattri=cntAddress.getAttribute("ee");
             System.out.println(eeattri);
           }
        }
    catch (Exception e) {
      System.out.println("Cannot read the addsfile:" + e.getMessage());
    }
  }
}


接着我又重新编写了另外的一个程序,如下:

import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;

public class Saveadds extends Object{
  public static void main(String args[]) {
    String addsFile="adds.xml";
    Document addsDoc = null;
    try {
      DocumentBuilderFactory docbuilderfactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder docbuilder = docbuilderfactory.newDocumentBuilder();
      addsDoc = docbuilder.parse(addsFile);
      addsDoc.normalize();
      NodeList Address=addsDoc.getElementsByTagName("customer");
      for (int i=0;i<Address.getLength();i++)
          {
             Node cntAddress = Address.item(i);
             NamedNodeMap nnm = cntAddress.getAttributes();
             if(nnm!=null)
             {
               Node[] matchNodes = new Node[nnm.getLength()];
               for (int j=0; j<nnm.getLength();j++)
               {
                  matchNodes[j] = nnm.item(j);
               }
               for (int ii=0;ii<nnm.getLength();ii++)
                {
                  Node node = matchNodes[i];
                  System.out.print(node.getNodeName() + "=" +node.getNodeValue() );
                }
             }
           }
        }
    catch (Exception e) {
      System.out.println("Cannot read the addsfile:" + e.getMessage());
    }
  }
}

编译没问题,但是为什么执行该程序时没有任何结果,只会再次显示java文件编辑通过的结果,难道它又一次编辑了该java文件?。


这些问题看起来复杂,其实对于高手来说应该比较简单吧,急盼各位相助,小弟感激不尽!


--  作者:gemingke
--  发布时间:7/7/2006 8:24:00 PM

--  
虽然我不懂编程,不过,你的xml文档本身就有问题吧。

ref的值必须是实际存在的。看了你的文档,发现好几个ref的值并没有在文档中出现。是不是因为这个问题?


--  作者:piebila
--  发布时间:7/7/2006 8:59:00 PM

--  
哦,我那个“ref”代表的并不是Schema语法里的那个“ref”,这里只是一个纯粹的属性,只是在这恰巧取了“ref”这个名字。
--  作者:pretender
--  发布时间:9/7/2006 11:03:00 AM

--  
你的程序不对
Element addsRoot=document.getDocumentElement();
      NodeList Address=addsRoot.getElementsByTagName("customer");
      for (int i=0;i<Address.getLength();i++){
             Element cntAddress = (Element)Address.item(i);
             String id= cntAddress.getElementsByTagName("id").item(0).getTextContent();
             System.out.println(id);
             String refattri=cntAddress.getElementsByTagName("id").item(0).getAttributes().item(0).getNodeValue();
             System.out.println(refattri);
      }
给你个参考,下面是前几个输出

pjl
#002
jjj
#003


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms