要求用Java 格式化的结果 存放在 Map 中,最好 再把Map 放在List中    其中 "r8"表示double数据类型, <?xml version="1.0" encoding="gb2312"?>
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD attrname="b" fieldname="SERIALNO" fieldtype="string" required="true" WIDTH="20"/>
<FIELD attrname="c" fieldname="ACCTSERIALNO" fieldtype="string" WIDTH="100"/>
<FIELD attrname="d" fieldname="CARDTYPE" fieldtype="r8"/>
<FIELD attrname="e" fieldname="TXNSERIALNO" fieldtype="string" WIDTH="20"/>
<FIELD attrname="f" fieldname="BIZNO" fieldtype="string" WIDTH="20"/>
<FIELD attrname="g" fieldname="TRADENAME" fieldtype="string" WIDTH="40"/>
<FIELD attrname="h" fieldname="CUR" fieldtype="string" SUBTYPE="FixedChar" WIDTH="3"/>
<FIELD attrname="i" fieldname="AMT" fieldtype="r8"/>
<FIELD attrname="j" fieldname="OPERID" fieldtype="string" WIDTH="10"/>
<FIELD attrname="k" fieldname="PRINTDEGREE" fieldtype="r8"/>
<FIELD attrname="l" fieldname="CARDNO" fieldtype="r8"/>
<FIELD attrname="m" fieldname="CARDNAME" fieldtype="string" WIDTH="40"/>
<FIELD attrname="n" fieldname="ACCTDATE" fieldtype="dateTime"/>
<FIELD attrname="o" fieldname="ORGNO" fieldtype="string" WIDTH="20"/>
</FIELDS>
</METADATA>
<ROWDATA>
<ROW b="1111141321259821484" c="1111140000013070" d="2.0" e="1111140000013070" f="5566IRJX11000289" g="登记解付" h="USD" i="25496.68" j="96" k="0.0" l="21.0" m="通用记帐凭证" n="20111114T00:00:00000" o="1000000000"  />
<ROW b="1111141321259851625" c="1111140000013069" d="2.0" e="1111140000013069" f="5566IRJX11000290" g="登记解付" h="USD" i="35431.6" j="96" k="0.0" l="21.0" m="通用记帐凭证" n="20111114T00:00:00000" o="1000000000"  />
</ROWDATA>
</DATAPACKET>

解决方案 »

  1.   

    我把FIELD的值全部取出来了,ROW也是差不多的
    我对怎么封装成map的需求不太清楚,lz自己做吧import java.io.File;
    import java.util.List;import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.io.SAXReader;public class MyReaderXMLTest {
    public static void main(String[] args) {
           try {
      SAXReader saxReader=new SAXReader();
      Document doc=saxReader.read(new File("MyXml1.xml"));
      List<Node> data=doc.selectNodes("/DATAPACKET/METADATA/FIELDS/FIELD");
      for(Node node:data){
      if("Element".equals(node.getNodeTypeName())){
        Element element=(Element)node;
        System.out.print(element.attributeValue("attrname")+"\t");
        System.out.print(element.attributeValue("fieldname")+"\t");
        System.out.print(element.attributeValue("fieldtype")+"\t");
        System.out.print(element.attributeValue("required")+"\t");
        System.out.print(element.attributeValue("WIDTH")+"\t");
        System.out.println();
      }
      }
           } catch (Exception e) {
            e.printStackTrace();
           }   
     }
    }
      

  2.   

    嗯嗯 多谢楼上咯 在网上查啦半天资料  自己也把数据解析出来啦  现在正在研究怎么根据 attrname属性 把FIELD中的数据和ROW中的数据关联一起 装在Map中。。 
      
      

  3.   

    这个很好弄的....你去好好看看dom4j就行了..都封装好了
      

  4.   

    对xml操作的很多
    dom4j,sax,dom,Jdom
      

  5.   

    嗯嗯 下面是我昨天做的  数据时解析出来啦 但还是无法把数据放在Map中 高手 看看 该怎么做
    import java.io.File;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;public class Dom4jTest { public void iterateWholeXML() { Map hm = new HashMap();
    String attrName; // 使用SAXReader解析
    SAXReader saxReader = new SAXReader(); try {
    Document document = saxReader.read(new File("F:\\test.xml"));
    // 获取节点
    Element root = document.getRootElement();
    System.out.println("DATAPACKET根节点" + root); // XPath取得具体的节点
    Element driverClassNameElement = (Element) document
    .selectSingleNode("//DATAPACKET/METADATA/FIELDS/FIELD");
    String driverClassName = driverClassNameElement.getText();// 没有文本内容
    System.out.println("driverClassName" + driverClassName); // 获取FIELD 节点中的属性内容
    // 用XPath直接获得要操作的FIELD节点
    List driverClassNameListField = document
    .selectNodes("//DATAPACKET/METADATA/FIELDS/FIELD");
    for (Iterator itField = driverClassNameListField.iterator(); itField
    .hasNext();) {
    Element fieldElement = (Element) itField.next();
        attrName = fieldElement.attributeValue("attrname");
    String fieldName = fieldElement.attributeValue("fieldname");
    String fieldType = fieldElement.attributeValue("fieldtype");
    String fieldRequired = fieldElement.attributeValue("required");
    String fieldWidth = fieldElement.attributeValue("WIDTH");
    System.out.println("attrname:" + attrName + "\t" + "fieldname:"
    + fieldName + "\t" + "fieldtype:" + fieldType + "\t"
    + "fieldrequired:" + fieldRequired + "\t"
    + "fieldWidth:" + fieldWidth);
    }
    // 获取ROW节点中的属性内容
    // 用XPath直接获得要操作的ROW节点
    List driverClassNameListRow = document
    .selectNodes("//DATAPACKET/ROWDATA/ROW");
    for (Iterator itRow = driverClassNameListRow.iterator(); itRow
    .hasNext();) {
    Element rowElement = (Element) itRow.next();
    String bName = rowElement.attributeValue("b");
    String cName = rowElement.attributeValue("c");
    String dName = rowElement.attributeValue("d");
    String eName = rowElement.attributeValue("e");
    String fName = rowElement.attributeValue("f");
    String gName = rowElement.attributeValue("g");
    String hName = rowElement.attributeValue("h");
    String iName = rowElement.attributeValue("i");
    String jName = rowElement.attributeValue("j");
    String kName = rowElement.attributeValue("k");
    String lName = rowElement.attributeValue("l");
    String mName = rowElement.attributeValue("m");
    String nName = rowElement.attributeValue("n");
    String oName = rowElement.attributeValue("o");
    System.out.println("b:" + bName + "\t" + "c:" + cName + "\t"
    + "d:" + dName + "\t" + "e:" + eName + "\t" + "f:"
    + fName + "\t" + "g:" + gName + "\t" + "h:" + hName
    + "\t" + "i:" + iName + "\t" + "j:" + jName + "\t"
    + "k:" + kName + "\t" + "l:" + lName + "\t" + "m:"
    + mName + "\t" + "n:" + nName + "\t" + "o:" + oName);
    }

    } catch (DocumentException e) {
    e.printStackTrace();
    }
    } public static void main(String[] args) {
    Dom4jTest dom = new Dom4jTest();
    dom.iterateWholeXML(); }}
      

  6.   

    需求是 FIELD节点中的attrname="b"fieldname="SERIALNO"(自认为对应Map中的KEY键) .....等属性是用来 修饰 ROW节点中的b="100000000000"(对应Map中的value)数据的 以此类推c、d、f.....  都放在Map中。  也不是知道自己的想法对不对.....  求大神指教  
      

  7.   

    lz要干什么说不清楚,我都是靠猜的import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;public class MyReaderXMLTest1 { //return list
    public List iterateWholeXML() {

    // Map hm = new HashMap();

    //add
    List list = new ArrayList();

    String attrName;

    // 使用SAXReader解析
    SAXReader saxReader = new SAXReader();

    try {
    Document document = saxReader.read(new File("MyXml1.xml"));
    // 获取节点
    Element root = document.getRootElement();
    System.out.println("DATAPACKET根节点" + root);

    // XPath取得具体的节点
    Element driverClassNameElement = (Element) document.selectSingleNode("//DATAPACKET/METADATA/FIELDS/FIELD");
    String driverClassName = driverClassNameElement.getText();// 没有文本内容
    System.out.println("driverClassName" + driverClassName);

    // 获取FIELD 节点中的属性内容
    // 用XPath直接获得要操作的FIELD节点
    List driverClassNameListField = document.selectNodes("//DATAPACKET/METADATA/FIELDS/FIELD");
    Map map = null;
    for (Iterator itField = driverClassNameListField.iterator(); itField.hasNext();) {
    Element fieldElement = (Element) itField.next();
    attrName = fieldElement.attributeValue("attrname");
    String fieldName = fieldElement.attributeValue("fieldname");
    String fieldType = fieldElement.attributeValue("fieldtype");
    String fieldRequired = fieldElement.attributeValue("required");
    String fieldWidth = fieldElement.attributeValue("WIDTH");

    //add
    map = new HashMap();
    map.put("type", "Field");
    map.put("attrName",attrName);
    map.put("fieldName",fieldName);
    map.put("fieldType",fieldType);
    map.put("fieldRequired",fieldRequired);
    map.put("fieldWidth",fieldWidth);
    list.add(map);
    //add

    System.out.println("attrname:" + attrName + "\t" + "fieldname:"+ fieldName + "\t" + "fieldtype:" + fieldType + "\t"+ "fieldrequired:" + fieldRequired + "\t"+ "fieldWidth:" + fieldWidth);
    }
    // 获取ROW节点中的属性内容
    // 用XPath直接获得要操作的ROW节点
    List driverClassNameListRow = document.selectNodes("//DATAPACKET/ROWDATA/ROW");
    for (Iterator itRow = driverClassNameListRow.iterator(); itRow.hasNext();) {
    Element rowElement = (Element) itRow.next();
    String bName = rowElement.attributeValue("b");
    String cName = rowElement.attributeValue("c");
    String dName = rowElement.attributeValue("d");
    String eName = rowElement.attributeValue("e");
    String fName = rowElement.attributeValue("f");
    String gName = rowElement.attributeValue("g");
    String hName = rowElement.attributeValue("h");
    String iName = rowElement.attributeValue("i");
    String jName = rowElement.attributeValue("j");
    String kName = rowElement.attributeValue("k");
    String lName = rowElement.attributeValue("l");
    String mName = rowElement.attributeValue("m");
    String nName = rowElement.attributeValue("n");
    String oName = rowElement.attributeValue("o");
    System.out.println("b:" + bName + "\t" + "c:" + cName + "\t"
    + "d:" + dName + "\t" + "e:" + eName + "\t" + "f:"
    + fName + "\t" + "g:" + gName + "\t" + "h:" + hName
    + "\t" + "i:" + iName + "\t" + "j:" + jName + "\t"
    + "k:" + kName + "\t" + "l:" + lName + "\t" + "m:"
    + mName + "\t" + "n:" + nName + "\t" + "o:" + oName);
    }

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

    //add
    return list;
    } public static void main(String[] args) {
    MyReaderXMLTest1 dom = new MyReaderXMLTest1();

    //add
    List list = dom.iterateWholeXML();
    System.out.println(((Map)list.get(0)).get("attrName"));
    }}
      

  8.   

    为什么不试试JiBX, 公认超快的将xml转换成java对象的方法.
      

  9.   

    多谢楼上大神啦  
    不好意思我表达不是很清楚   
    先道歉啦 嗯嗯 看过代码 不过还没达到预期的目的 
    List显示结果中[{fieldType=string, fieldWidth=20, fieldName=SERIALNO, attrName=b,fieldRequired=true},......怎么和ROW中的数据b="1111141321259821484"关联 再装在Map中 同理 {fieldType=string, fieldWidth=100, fieldName=ACCTSERIALNO, attrName=c, fieldRequired=null},和ROW中的c="1111140000013070"组成键值对 装在Map中在线等咯  
      

  10.   

    lz的意思是
    field定义了row类的属性
    把一个row用field的方式解析出来,放到一个map里面
    再把多个map放到list里面这样才意思很类也
      

  11.   

    虽然不是很懂但是好像听过
    xml好像可以和java对象互转
    很方便的 
      

  12.   


    嗯嗯  field定义了row类的属性
    把一个row用field的方式解析出来,放到一个map里面
    这样就行啦 可怎么实现呢?  
      

  13.   

    嗯嗯 现在正在用dom4j    正在学习中 呵呵   
    多谢提议哦
      

  14.   


    //假设xml文件中的内容  是data
    Document doc  =  DocumentHelper.parseText(data);
    //List<Node> 就是field的集合,然后循环,将每一个放到Map中
    List<Node> docs = doc.selectNodes("//DATAPACKET /METADATA/FIELDS");
    //同理得到row的集合
    List<Node> docs2 = doc.selectNodes("//DATAPACKET /ROWDATA");
      

  15.   


    正是这样做的 可是怎么实现下面的效果类?
    field定义了row类的属性
    把一个row用field的方式解析出来,放到一个map里面