Как добавить узел в XML с помощью XMLBeans XmlObject - PullRequest
3 голосов
/ 26 марта 2010

Моя цель - взять строку XML, проанализировать ее с помощью XMLBeans XmlObject и добавить несколько дочерних узлов.

Вот пример документа (xmlString),

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

Вот как я хотел бы, чтобы 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>

По сути, просто добавляем узел <phoneNumbers/> с двумя дочерними узлами <home/> и <work/>.

Насколько я понял,

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

Спасибо

Ответы [ 4 ]

6 голосов
/ 06 мая 2011

Вот пример использования XmlCursor для вставки новых элементов. Вы также можете получить DOM Node для XmlObject и использовать эти 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));
    }

}
3 голосов
/ 28 апреля 2010

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
0 голосов
/ 01 августа 2012

Метод getDomNode() предоставляет доступ к базовому узлу DOM W3C. Затем вы можете добавлять дочерние элементы, используя интерфейс документа W3C.

0 голосов
/ 26 марта 2010

Может быть немного сложно манипулировать объектами, используя только интерфейс XmlObject. Рассматривали ли вы создание Java-объектов XMLBEANS из этого xml?

Если у вас нет XSD для этой схемы, вы можете сгенерировать ее, используя XMLSPY или некоторые другие инструменты.

Если вы просто хотите манипулировать XML (т.е. добавлять узлы), вы можете попробовать другие API, такие как jdom или xstream, или что-то подобное.

...