4

我在运行时有可更改的 xml 模式文件。我在我的代码中使用 XPath 表达式和要在 XML 文件中输入的值获取 java 集合。在所有这些运行时输入的帮助下,我必须生成 XML 文件。下面附上示例输入和输出。

  1. 以下是示例架构(无固定格式):

        <xs:complexType name="root">
            <xs:sequence>
                <xs:element name="top" type="topType" />
            </xs:sequence>
       </xs:complexType>            
       <xs:element name="root" type="root">
       </xs:element>              
       <xs:complexType name="topType">
          <xs:element name="mode" use="required" />
           <xs:element name="address" use="required" />
       </xs:complexType>
    
  2. 我得到的 xpath 表达式和值位于哈希映射的键值对中。我需要将这些 xpath 值与 output.xml 中的相应 XMLElement 值一起放置。xpath 表达式和值如下:

    1. 表达式:/root/top/address 值:10.200.111。
    2. 表达式:/root/top/mode 值:cluster
  3. java 代码应该生成 XML 文件作为 Output.xml :(这是需要在运行时从所有收集的输入生成的虚拟文件)

    <root>
        <top>
            <mode>cluster</mode>
            <address>10.200.111.111</address>
        </top>
    </root>
    

请建议是否有人遇到过这种情况。

提前致谢。

4

2 回答 2

1

请查看下面的代码,以便在生成后从 xsd 生成 xml,使用 XMLDocument、XPath 来更新/添加字段

import javax.xml.transform.stream.StreamResult;

import jlibs.xml.sax.XMLDocument;
import jlibs.xml.xsd.XSInstance;
import jlibs.xml.xsd.XSParser;

import org.apache.xerces.xs.XSModel;

import javax.xml.namespace.QName;

public class XSDToXML {

    /**
     * @param args
     * @throws ClassCastException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException, ClassCastException {
        try {

            XSModel model = (XSModel) new XSParser().parse("c:\\kar\\xs.xsd");
            XMLDocument sample = new XMLDocument(new StreamResult(
                "c:\\kar\\root3.xml"), false, 4, null);
                        QName root = new QName("root");
            XSInstance instance = new XSInstance();
            instance.minimumElementsGenerated = 0;
            instance.maximumElementsGenerated = 0;
            instance.generateDefaultAttributes = true;
            instance.generateOptionalAttributes = true;
            instance.maximumRecursionDepth = 0;
            instance.generateOptionalElements = true;
            instance.generate(model, root, sample);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

你需要下载 jlibs-xml.jar , xercesImpl.jar 和 jlibs-core.jar 文件

于 2013-05-16T09:40:44.433 回答
0

只需查看此代码,它非常简单

public class MyTestClass {

    public static void main(String[] args) {
        try{
        Map map= new HashMap<String,String>();
        map.put("cluster", "10.200.111.111");
        map.put("cluster1", "10.200.121.111");

        MyXML xml = new MyXML();
        List<Top> top1= new ArrayList<Top>();
        Set<String> keys = map.keySet();
        for(String key : keys){
            Top top=new Top();
            top.setMode(key);
            top.setAddress((String)map.get(key));
            top1.add(top);
        }
        xml.setTop(top1);
        File file = new File("C:\\kar\\file.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(MyXML.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        // output pretty printed
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        jaxbMarshaller.marshal(xml, file);
        jaxbMarshaller.marshal(xml, System.out);
        }catch(Exception ex){
            System.out.println(ex.getMessage());
        }
    }
}


@XmlRootElement(name="top")
@XmlType(name="top")
@XmlAccessorType(XmlAccessType.FIELD)
public class Top {

    @XmlElement(name="mode", required=true)
    private String mode;

    @XmlElement(name="mode", required=true)
    private String address;

    public String getMode() {
        return mode;
    }

    public void setMode(String mode) {
        this.mode = mode;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }




}





@XmlRootElement(name="root")
@XmlType(name="root")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyXML {


    @XmlElement(name="Top")
    private List<Top> top;

    public List<Top> getTop() {
        return top;
    }

    public void setTop(List<Top> top) {
        this.top = top;
    }

}

您甚至可以使用 XSLT,http://www.ictforu.com/index.php/Core-Java/java-xslt.html

于 2013-05-16T06:28:22.287 回答