读书人

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

发布时间: 2012-01-28 22:06:13 作者: rapoo

关于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下载的。记得把分给我啊!

读书人网 >J2SE开发

热点推荐