使用JDOM更新xml节点

时间:2014-02-13 07:42:58

标签: java xml jdom

我在更新xml文件中的数据时遇到问题。

我的xml文件如下所示:

<root>
 <info>
 .....
 </info>
  <OBJECT_TYPE>x2000</OBJECT_TYPE>
  <prop>
    <DESCRIPTION>fast train</DESCRIPTION>
    <PARENT>NULL</PARENT>
    <VIRTUAL>0</VIRTUAL>
    <VISIBLE>1</VISIBLE>
    <PICTURE>NULL</PICTURE>
    <HELP>NULL</HELP>
    <MIN_NO>1</MIN_NO>
    <MAX_NO>1</MAX_NO>
    <NAME_FORMAT>NULL</NAME_FORMAT>
  </prop>
<param>
  <PARAMETER>nidbrc</PARAMETER>
  <DATA_TYPE>String</DATA_TYPE>
  <DESCRIPTION>super fast</DESCRIPTION>
  <MIN_NO>1</MIN_NO>
  <MAX_NO>1</MAX_NO>
  <ORDER1>1</ORDER1>
  <NESTED>1</NESTED>
  <DEFAULT1>NULL</DEFAULT1>
  <FORMAT>100:45</FORMAT>
</param>
<param>
</param>
<param>
</param>
<param>
</param>
...
</type>
<type>
  ... 
 </type>
 <type>
</root>

这里我试图从类型1获取我的第一个参数并更新第一个参数9

public static void main(String[] args) {

        File xml = new File("test.xml");

        try {
            XMLOutputter xmlOut = new XMLOutputter();
            Document doc = (Document) new SAXBuilder().build(xml);
            Element rootNode = doc.getRootElement();
            Element typeContent = rootNode.getChildren().get(1);
            System.out.println("typeContent : " + typeContent.getChildren());

            for (int i = 0; i < typeContent.getContentSize(); i++) {

                List<Element> list = typeContent.getChildren("param");

                if (list.size() > 0) {
                    Element element = list.get(1);
                    List paramChilds = element.getChildren("PARAMETER");

                    for (int j = 0; j < paramChilds.size(); j++) {

                        Element node = (Element) paramChilds.get(j);
                        System.out.println(node.getText());
                        // xmlOut.setFormat(Format.getPrettyFormat());
                        // xmlOut.output(doc, new FileWriter("test.xml"));
                    }
                }
            }

        } catch (IOException io) {
            System.out.println(io.getMessage());
        } catch (JDOMException jdomex) {
            System.out.println(jdomex.getMessage());
        }

我觉得很难知道如何深入研究xml文件,因此这个工作正常但是这个是null:node.getChild(“PARAMETER”)。setText(“Bla”);

4 个答案:

答案 0 :(得分:2)

你可以像这样循环所有'param'孩子:

Document doc = (Document) new SAXBuilder().build(xml);
Element rootNode = doc.getRootElement();

// get all 'param' children
List<Element> paramElements = root.getChildren("param");
for (Element param: paramElements) {
    // do something intelligent
    param.getChild("PARAMETER").setText("Bla");
}

// write to file
xmlOut.setFormat(Format.getPrettyFormat());
xmlOut.output(doc, new FileWriter("test.xml"));

或者您可以使用xpath搜索元素并使用它做事; example

答案 1 :(得分:1)

在这里,您似乎正在尝试设置第一个PARAMETER元素的文本,该元素是第一个PARAMETER元素的子元素,该元素是{{1}的第二个子元素的子元素} element。

root

您的示例x​​ml中似乎不存在此类元素。

  1. Element rootNode = doc.getRootElement(); ... Element typeContent = rootNode.getChildren().get(1); ... Element node = typeContent.getChild("PARAMETER"); node.getChild("PARAMETER").setText("Bla"); 对应于元素typeContent,该元素没有<OBJECT_TYPE>x2000</OBJECT_TYPE>元素子元素。

  2. 没有PARAMETER个元素属于 PARAMETER元素。

  3. 更重要的是,出于某种原因,你似乎做了15次完全相同的事情。那是为什么?

答案 2 :(得分:1)

您正在寻找像这样的param元素:

List<Element> list = typeContent.getChildren("param");

但是typeContent没有任何param个孩子。 typeContent是:

Element typeContent = rootNode.getChildren().get(1);

据我所知,是:

<OBJECT_TYPE>x2000</OBJECT_TYPE>

我想,你应该寻找像param这样的孩子:

List<Element> paramElements = root.getChildren("param");

应该使用JDOM2而不是JDOM。使用JDOM2,您的XPath选项更加简单:

XPathExpression<Element> paramxpath = XPathFactory.instance()
         .compile("/root/param", Filters.element());
for (Element param : paramxpath.evaluate(doc)) {
    System.out.println(param.getText());
}

答案 3 :(得分:0)

这是我的完整解决方案:

public void updateParameters(int index, int row, int column,
            String columnName, Object data) throws Exception {

        int objTypeIndex = index + 1;

        File xml = new File("xmlFiles/CoreDatamodel.xml");

        try {
            XMLOutputter xmlOut = new XMLOutputter();
            org.jdom2.Document doc = new SAXBuilder().build(xml);
            Namespace ns = Namespace.getNamespace("http://www.bombardier.com");
            org.jdom2.Element rootNode = doc.getRootElement();
            org.jdom2.Element typeContent = rootNode.getChildren().get(
                    objTypeIndex);

            List<Element> list = typeContent.getChildren("param", ns);

            if (list.size() > 0) {
                Element element = list.get(row);
                List paramChilds = element.getChildren(columnName, ns);

                Element node = (Element) paramChilds.get(0);
                node.setText(data.toString());
                System.out.println(node.getText());
                xmlOut.setFormat(Format.getPrettyFormat());
                xmlOut.output(doc, new FileWriter("xmlFiles/CoreDatamodel.xml"));

            }

        } catch (IOException io) {
            System.out.println(io.getMessage());
        } catch (JDOMException jdomex) {
            System.out.println(jdomex.getMessage());
        }

    }