最近在作一个处理xml树的问题,我使用的是jdom
有个需求
  String s= xml.BuildXML("123|100|wumin|", "//message/tel/amout/name/");
假如有一个字符串为//message/tel/amout/name/
要生成的结果是
<?xml version="1.0" encoding="GBK"?>
<Message>
    <tel>123</tel>
    <amout>100</amout>
    <name>wumin</name>
</Message>
应该怎么作呢假如传入的xml定义还包括属性 //message/tel[@number='1']/amout/name
最后的结果为
<?xml version="1.0" encoding="GBK"?>
<Message>
    <tel number=‘1’>123</tel>
    <amout>100</amout>
    <name>wumin</name>
</Message>

解决方案 »

  1.   

    package com.pss.xml.dom;import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.List;import javax.management.AttributeList;import org.dom4j.Document;
    import org.dom4j.Element;
    import org.jdom.Attribute;public class Test1 { public static void main(String[] args) throws Exception {
    long start = System.currentTimeMillis();
    String value = "123|100|wumin|";
    String tree = "//message/tel/amout/name/";
    String treeAtt1 = "//message/tel[@number='1']/amout/name/";
    String treeAtt2 = "//message/tel[@number='1'][@sumber='ew']/amout/name/";
    String treeAtt4 = "//message/tel[@number='1'][@sumber='ew'][@country='china'][@people='chinese']/amout/name/";
    Test1 hand = new Test1();
    hand.makeXml(value, treeAtt4);
    long end = System.currentTimeMillis();
    System.out.println("This function cost me:" + (end - start) + "ms");
    } //形成字符串。
    public String makeXml(String xmlValue, String xmlTree) throws Exception {
    List value = makeList(xmlValue, '|');
    List node = makeList(xmlTree.substring(2, xmlTree.length()), '/');
    Document doc = Mafioso.create();
    Element root = doc.addElement((String) node.get(0));
    for (int i = 0; i < value.size(); i++) {
    String nodeValue = (String) value.get(i);
    Object objNode = node.get(i + 1);
    if (objNode instanceof String) {
    root.addElement((String) objNode).setText(nodeValue);
    } else {
    List nodeList = (List) objNode;
    String nodeName = (String) nodeList.get(0);
    AttributeList attList = (AttributeList) nodeList.get(1);
    Element ele = root.addElement((String) nodeList.get(0));
    for (int k = 0; k < attList.size(); k++) {
    Attribute att = (Attribute) attList.get(k);
    ele.setAttributeValue(att.getName(), att.getValue());
    }
    ele.setText(nodeValue);
    }
    } try {
    FileOutputStream fos = new FileOutputStream(
    "G:\\05 月份\\0524\\bo.xml");
    fos.write(Mafioso.format(doc.asXML(), null).getBytes());
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return doc.asXML();
    } //为节点或者值equip成List。
    public List makeList(String src, char c) {
    List list = new ArrayList();
    int xPoint = 0;
    int count = 0;
    while (xPoint < src.length()) {
    count++;
    int index = src.indexOf(c, xPoint);
    String value = src.substring(xPoint, index);
    Object objValue = makeObject(value);
    list.add(objValue);
    xPoint = index + 1;
    if (count > 10)
    break;
    }
    return list;
    } //将每个节点进行处理,分有无attribute两种
    public Object makeObject(String src) {
    int xPoint = src.indexOf('@');
    if (xPoint == -1)
    return src;
    String value = src.substring(0, xPoint - 1);
    List list = new ArrayList();
    list.add(value);
    AttributeList attList = new AttributeList();
    while (xPoint < src.length()) {
    int index = src.indexOf(']', xPoint);
    Attribute att = makeAttribute(src.substring(xPoint + 1, index));
    attList.add(att);
    xPoint = src.indexOf('@', index);
    if (xPoint == -1) {
    break;
    }
    }
    list.add(attList);
    return list;
    } //对属性进行处理。
    public Attribute makeAttribute(String src) {
    int index = src.indexOf('=');
    String name = src.substring(0, index);
    String value = src.substring(index + 1).replaceAll("'", "");
    Attribute att = new Attribute(name, value);
    return att;
    }
    }我来凑个热闹来着。
    这个程序凑合着可以用,不过呢,提供的字符串要有相应的约束。
    约束得越紧,程序的可移植性就越好,否则,就要做相应的修改了。
    I am GeorgeBest!
      

  2.   

    还有一个比较难的问题
    <?xml version="1.0" encoding="GBK"?>
    <Message>
     <public>
        <tel>123</tel>
        <tel>789</tel>
        <amout>100</amout>
        <amout>200.00</amout>
        <name>wumin</name>
      </public>
    </Message>根据上述xml树,有一个xml字符串定义为 //Message/public/tel:2|//Message/public/amout:2|//Message/public/name|
    要求最后得出的xml树为
    <?xml version="1.0" encoding="GBK"?>
    <Message>
     <public>
        <tel>789</tel>
        <amout>200.00</amout>
        <name>wumin</name>
      </public>
    </Message>
    冒号后面的数字为取第几个节点,大侠可否指点一下?