首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于DOM解析xml,(顶者有分)

2012-01-28 
关于DOM解析xml,高分求教(顶者有分)我想使用org.w3c.dom.*来解析xmlxml为:?xmlversion 1.0 encoding

关于DOM解析xml,高分求教(顶者有分)
我想使用org.w3c.dom.*来解析xml
xml为:

<?xml   version= "1.0 "   encoding= "GBK "?>
<ROOT>
    <SEND>
        <SETYEAR> 2006 </SETYEAR>
        <SENDER> 001001001 </SENDER>
        <RECIPIENTS> 0020000001 </RECIPIENTS>
        <DATA   DATATYPE= "602 "   DESCRIPTION= "公务卡消费汇总信息 ">
            <OBJECT   NAME= "PAY_BILL "   ID= "1 "   DESCRIPTION= "支付凭证 ">
                <RECORD>
                    <ATTRIBUTE   NAME= "Pay_Bill_ID "   TYPE= " "   DESCRIPTION= "凭证号 "> 1012006-02001-00031 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "PAY_BILL_INFO_ID "   TYPE= " "   DESCRIPTION= " "> 1012006-02001-00031 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "CARD_COUNT "   TYPE= " "   DESCRIPTION= "笔数 "> 3 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "RECEIVER_DISP_CODE "   TYPE= " "   DESCRIPTION= " "> 0020000001 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "SET_YEAR "   TYPE= " "   DESCRIPTION= " "> 2006 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "SUM_MONEY "   TYPE= " "   DESCRIPTION= "金额合计 "> 1580 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "PAY_DETAIL_SUM_ID "   TYPE= "2 "   DESCRIPTION= "自增序号 "> 1 </ATTRIBUTE>
        <OBJECT   NAME= "PAY_DETAIL_SUM "   ID= "2 "   DESCRIPTION= " ">
                <RECORD>
            <ATTRIBUTE   NAME= "PAYEE_SUM_CODE "   TYPE= " "   DESCRIPTION= "还款账号 "> 5166189088801111 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAY_BILL_INFO_ID "   TYPE= " "   DESCRIPTION= " "> 1012006-02001-00031 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAYEE_SUM_NAME "   TYPE= " "   DESCRIPTION= " "> 瓦岚 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "CARD_HOLDER "   TYPE= " "   DESCRIPTION= " "> 瓦岚 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "TakeBack_Money "   TYPE= " "   DESCRIPTION= "还款金额 "> 276 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAY_DETAIL_SUM_ID "   TYPE= "2 "   DESCRIPTION= "自增序号 "> 1 </ATTRIBUTE>
        </RECORD>
                <RECORD>
                    <ATTRIBUTE   NAME= "PAYEE_SUM_CODE "   TYPE= " "   DESCRIPTION= "还款账号 "> 5166189888801111 </ATTRIBUTE>


                    <ATTRIBUTE   NAME= "PAY_BILL_INFO_ID "   TYPE= " "   DESCRIPTION= " "> 1012006-02001-00031 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAYEE_SUM_NAME "   TYPE= " "   DESCRIPTION= " "> 瓦伟岳 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "CARD_HOLDER "   TYPE= " "   DESCRIPTION= " "> 瓦伟岳 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "TakeBack_Money "   TYPE= " "   DESCRIPTION= "还款金额 "> 229 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAY_DETAIL_SUM_ID "   TYPE= "2 "   DESCRIPTION= "自增序号 "> 2 </ATTRIBUTE>
        </RECORD>
        <RECORD>
            <ATTRIBUTE   NAME= "PAYEE_SUM_CODE "   TYPE= " "   DESCRIPTION= "还款账号 "> 5166189888801111 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAY_BILL_INFO_ID "   TYPE= " "   DESCRIPTION= " "> 1012006-02001-00031 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAYEE_SUM_NAME "   TYPE= " "   DESCRIPTION= " "> 汪杰 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "CARD_HOLDER "   TYPE= " "   DESCRIPTION= " "> 汪杰 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "TakeBack_Money "   TYPE= " "   DESCRIPTION= "还款金额 "> 1075 </ATTRIBUTE>
            <ATTRIBUTE   NAME= "PAY_DETAIL_SUM_ID "   TYPE= "2 "   DESCRIPTION= "自增序号 "> 3 </ATTRIBUTE>
        </RECORD>
            </OBJECT>
        </RECORD>
            </OBJECT>
        </DATA>
    </SEND>
</ROOT>


其中
<SETYEAR> 2006 </SETYEAR>
        <SENDER> 001001001 </SENDER>
        <RECIPIENTS> 0020000001 </RECIPIENTS>
我能够解析,我的方法是:

public   boolean   parseXml(String   xmlFileName)   {
if   (!xmlFileName.equals( " "))   {
//   以后在这里加XML文件的路径,File下面那个构造方法默认的路径为./
File   file   =   new   File(xmlFileName   +   ".xml ");
Document   doc   =   null;
try   {
/***********************************************************************
  *   定义工厂   API,使应用程序能够从   XML   文档获取生成   DOM   对象树的解析器。
  *   newInstance()方法为获取DocumentBuilderFactory   的新实例。
  */
DocumentBuilderFactory   dbf   =   DocumentBuilderFactory.newInstance();

//   定义   API,   使其从   XML   文档获取   DOM   文档实例。使用此类,应用程序员可以从   XML   获取一个   Document。
DocumentBuilder   db   =   dbf.newDocumentBuilder();



//   将给定文件的内容解析为一个   XML   文档,并且返回一个新的   DOM   Document   对象。
doc   =   db.parse(file);
}   catch   (IOException   ioe)   {
System.out.println( "不能找到此XML文件! ");
ioe.printStackTrace();
}   catch   (Exception   e)   {
System.out.println(e.getMessage());
}

/*************************************************************************
  *   getElementsByTagName(String   string)方法为
  *   按文档顺序返回包含在文档中且具有给定标记名称的所有Element的NodeList。
  */

String   setyear   =   doc.getElementsByTagName( "SETYEAR ").item(0)
.getFirstChild().getNodeValue();
System.out.println( "SETYEAR   :   "   +   setyear);
String   sender   =   doc.getElementsByTagName( "SENDER ").item(0)
.getFirstChild().getNodeValue();
System.out.println( "SENDER   :   "   +   sender);
String   recipients   =   doc.getElementsByTagName( "RECIPIENTS ").item(0)
.getFirstChild().getNodeValue();
System.out.println( "RECIPIENTS   :   "   +   recipients);


我想知道

<ATTRIBUTE   NAME= "Pay_Bill_ID "   TYPE= " "   DESCRIPTION= "凭证号 "> 1012006-02001-00031 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "PAY_BILL_INFO_ID "   TYPE= " "   DESCRIPTION= " "> 1012006-02001-00031 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "CARD_COUNT "   TYPE= " "   DESCRIPTION= "笔数 "> 3 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "RECEIVER_DISP_CODE "   TYPE= " "   DESCRIPTION= " "> 0020000001 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "SET_YEAR "   TYPE= " "   DESCRIPTION= " "> 2006 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "SUM_MONEY "   TYPE= " "   DESCRIPTION= "金额合计 "> 1580 </ATTRIBUTE>
        <ATTRIBUTE   NAME= "PAY_DETAIL_SUM_ID "   TYPE= "2 "   DESCRIPTION= "自增序号 "> 1 </ATTRIBUTE>

怎么使用dom来解析.

[解决办法]
我最近在学这个东西,帮你顶一下。
[解决办法]
UP
[解决办法]
是兄弟,挺上去!
[解决办法]

NodeList nl=doc.getElementsByTagName( "Data ");
for(int i=0;i <nl.getLength();i++){
Element e=(Element)nl.item(i);
String name=e.getAttribute( "name ")
}
[解决办法]
DATA标签就一个
NodeList nl=doc.getElementsByTagName( "OBJECT ");
for(int i=0;i <nl.getLength();i++){
Element e=(Element)nl.item(i);
String name=e.getAttribute( "name ");
String description=e.getAttribute( "DESCRIPTION ");
//得到record标签
NodeList nl2=e.getChildNodes();
for(int j=0;j <nl2.getLength();j++){
没有属性
Node nl3=n12.item(j);
//每个record标签下的所有attribute标签


NodeList nl4=nl3.getChildNodes();
for(...){
Node n=nl2.item(j);
if (n.getNodeType()==Node.ELEMENT_NODE){
String a_name= n.getAttribute( "NAME ");
String a_DESCRIPTION=n.getAttribute( "DESCRIPTION ")
String text=n.getTextContent().trim();
}

}
}
大概是这样吧.

[解决办法]
看看
[解决办法]
路过.....
[解决办法]
帮顶。。。
[解决办法]
帮顶,学习中哈!!
[解决办法]
我用JDOM可以生成一个差不多的,你明白思路就会解了。
<?xml version= "1.0 " encoding= "gb2312 " ?>
- <生成例子>
- <RECORD>
<ATTRIBUTE NAME= "Pay_Bill_ID " TYPE= " " DESCRIPTION= "凭证号 "> 1012006-02001-00031 </ATTRIBUTE>
<ATTRIBUTE NAME= "PAY_BILL_INFO_ID " TYPE= " " DESCRIPTION= " "> 1012006-02001-00031 </ATTRIBUTE>
<ATTRIBUTE NAME= "CARD_COUNT " TYPE= " " DESCRIPTION= "笔数 "> 3 </ATTRIBUTE>
</RECORD>
- <RECORD>
<ATTRIBUTE NAME= "Pay_Bill_ID " TYPE= " " DESCRIPTION= "凭证号 "> 1012006-02001-00032 </ATTRIBUTE>
<ATTRIBUTE NAME= "PAY_BILL_INFO_ID " TYPE= " " DESCRIPTION= " "> 1012006-02001-00032 </ATTRIBUTE>
<ATTRIBUTE NAME= "CARD_COUNT " TYPE= " " DESCRIPTION= "笔数 "> 4 </ATTRIBUTE>
</RECORD>
</生成例子>


public void saveXmlFile(File xfile){
DefaultJDOMFactory factory = new DefaultJDOMFactory();

try {
Element root = new Element( "生成例子 ");
Document doc = new Document(root);

Element content1 = new Element( "RECORD ");
root.addContent(content1);

Element e1 = new Element( "ATTRIBUTE ");
e1.setAttribute( "NAME ", "Pay_Bill_ID ");
e1.setAttribute( "TYPE ", " ");
e1.setAttribute( "DESCRIPTION ", "凭证号 ");
content1.addContent(e1.setText( "1012006-02001-00031 "));

Element e2 = new Element( "ATTRIBUTE ");
e2.setAttribute( "NAME ", "PAY_BILL_INFO_ID ");
e2.setAttribute( "TYPE ", " ");
e2.setAttribute( "DESCRIPTION ", " ");
content1.addContent(e2.setText( "1012006-02001-00031 "));

Element e3 = new Element( "ATTRIBUTE ");
e3.setAttribute( "NAME ", "CARD_COUNT ");
e3.setAttribute( "TYPE ", " ");
e3.setAttribute( "DESCRIPTION ", "笔数 ");
content1.addContent(e3.setText( "3 "));


Element content2 = new Element( "RECORD ");
root.addContent(content2);

Element e4 = new Element( "ATTRIBUTE ");
e4.setAttribute( "NAME ", "Pay_Bill_ID ");


e4.setAttribute( "TYPE ", " ");
e4.setAttribute( "DESCRIPTION ", "凭证号 ");
content2.addContent(e4.setText( "1012006-02001-00032 "));

Element e5 = new Element( "ATTRIBUTE ");
e5.setAttribute( "NAME ", "PAY_BILL_INFO_ID ");
e5.setAttribute( "TYPE ", " ");
e5.setAttribute( "DESCRIPTION ", " ");
content2.addContent(e5.setText( "1012006-02001-00032 "));

Element e6 = new Element( "ATTRIBUTE ");
e6.setAttribute( "NAME ", "CARD_COUNT ");
e6.setAttribute( "TYPE ", " ");
e6.setAttribute( "DESCRIPTION ", "笔数 ");
content2.addContent(e6.setText( "4 "));

Format format = Format.getCompactFormat();
format.setEncoding( "gb2312 "); //设置xml文件的字符为gb2312

XMLOutputter XMLOut = new XMLOutputter(format);

XMLOut.output(doc, new FileOutputStream(xfile));

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

这个是生成XML文件的代码,其实 <RECORD> 这个parentElement里面有若干个childElement,每个childElement的名字都是ATTRIBUTE,就是代码中的Element e1 = new Element( "ATTRIBUTE ");
Element e2 = new Element( "ATTRIBUTE ");不同只是他们的Attribute和Value不同;


解析的思路就是:假如我得到了RECORD这个Element,名字是record
就用record.getChildren( "ATTRIBUTE "),返回一个List <childElement> ;然后对List遍历,对每个childElement..getAttributeValue( "***** ")和childElement.getValue()即可。

建议你使用JDOM,在JAVA里面这个感觉最方便
www.jdom.org有JAR包和javadoc下载的。记得把分给我啊!

热点排行