简体   繁体   English

如何使用XMLBeans XmlObject将节点添加到XML

[英]How to add a node to XML with XMLBeans XmlObject

My goal is to take an XML string and parse it with XMLBeans XmlObject and add a few child nodes. 我的目标是获取XML字符串并使用XMLBeans XmlObject解析它并添加一些子节点。

Here's an example document (xmlString), 这是一个示例文档(xmlString),

<?xml version="1.0"?>
<rootNode>
 <person>
  <emailAddress>joefoo@example.com</emailAddress>
 </person>
</rootNode>

Here's the way I'd like the XML document to be after adding some nodes, 这是添加一些节点后我想要XML文档的方式,

<?xml version="1.0"?>
<rootNode>
 <person>
  <emailAddress>joefoo@example.com</emailAddress>
  <phoneNumbers>
   <home>555-555-5555</home>
   <work>555-555-5555</work>
  <phoneNumbers>
 </person>
</rootNode>

Basically, just adding the <phoneNumbers/> node with two child nodes <home/> and <work/> . 基本上,只需添加带有两个子节点<home/><work/><phoneNumbers/>节点。

This is as far as I've gotten, 就我而言,

XmlObject xml = XmlObject.Factory.parse(xmlString);

Thank you 谢谢

Here is an example of using the XmlCursor to insert new elements. 以下是使用XmlCursor插入新元素的示例。 You can also get a DOM Node for an XmlObject and using those APIs. 您还可以获取XmlObject的DOM节点并使用这些API。

import org.apache.xmlbeans.*;

/**
 * Adding nodes to xml using XmlCursor.
 * @see http://xmlbeans.apache.org/docs/2.4.0/guide/conNavigatingXMLwithCursors.html
 * @see http://xmlbeans.apache.org/docs/2.4.0/reference/org/apache/xmlbeans/XmlCursor.html
 */
public class AddNodes
{
    public static final String xml =
    "<rootNode>\n" +
    "  <person>\n" +
    "    <emailAddress>joefoo@example.com</emailAddress>\n" +
    "  </person>\n" +
    "</rootNode>\n";

    public static XmlOptions saveOptions = new XmlOptions().setSavePrettyPrint().setSavePrettyPrintIndent(2);

    public static void main(String[] args) throws XmlException
    {
        XmlObject xobj = XmlObject.Factory.parse(xml);
        XmlCursor cur = null;
        try
        {
            cur = xobj.newCursor();
            // We could use the convenient xobj.selectPath() or cur.selectPath()
            // to position the cursor on the <person> element, but let's use the
            // cursor's toChild() instead.
            cur.toChild("rootNode");
            cur.toChild("person");
            // Move to </person> end element.
            cur.toEndToken();
            // Start a new <phoneNumbers> element
            cur.beginElement("phoneNumbers");
            // Start a new <work> element
            cur.beginElement("work");
            cur.insertChars("555-555-5555");
            // Move past the </work> end element
            cur.toNextToken();
            // Or insert a new element the easy way in one step...
            cur.insertElementWithText("home", "555-555-5555");
        }
        finally
        {
            if (cur != null) cur.dispose();
        }

        System.out.println(xobj.xmlText(saveOptions));
    }

}

XMLBeans seems like a hassle, here's a solution using XOM : XMLBeans似乎很麻烦,这是使用XOM的解决方案:

import nu.xom.*;

Builder = new Builder();
Document doc = builder.build(new java.io.StringBufferInputStream(inputXml));
Nodes nodes = doc.query("person");
Element homePhone = new Element("home");
homePhone.addChild(new Text("555-555-5555"));
Element workPhone = new Element("work");
workPhone.addChild(new Text("555-555-5555"));
Element phoneNumbers = new Element("phoneNumbers");
phoneNumbers.addChild(homePhone);
phoneNumbers.addChild(workPhone);
nodes[0].addChild(phoneNumbers);
System.out.println(doc.toXML()); // should print modified xml

Method getDomNode() gives you access to the underlying W3C DOM Node. 方法getDomNode()使您可以访问底层的W3C DOM节点。 Then you can append childs using W3C Document interface. 然后,您可以使用W3C Document界面追加子项。

It may be a little difficult to manipulate the objects using just the XmlObject interface. 仅使用XmlObject接口操作对象可能有点困难。 Have you considered generating the XMLBEANS java objects from this xml? 您是否考虑过从此xml生成XMLBEANS java对象?

If you don't have XSD for this schema you can generate it using XMLSPY or some such tools. 如果您没有此架构的XSD,则可以使用XMLSPY或某些此类工具生成它。

If you just want XML manipulation (ie, adding nodes) you could try some other APIs like jdom or xstream or some such thing. 如果您只是想要XML操作(即添加节点),您可以尝试其他一些API,如jdom或xstream或其他类似的东西。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM