2014-02-13 147 views
-1

我在更新我的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文件,因此這一個沒有工作,但這一個是空的:node.getChild(「PARAMETER」)。setText(「Bla」);

回答

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()); 
     } 

    } 
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

+0

這不會工作。和xpath一樣棘手。我已經嘗試過,並有一個示例查詢的地方,但它也沒有工作。 – Sembrano

+0

你是什麼意思'不會工作'?錯誤?意外的行爲?究竟是什麼? –

+0

@ Sembrano我同意R. Oosterholt。使用'root.getChildren(「param」)'而不是'typeContent.getChildren(「param」)'(並且同意XPath是一件好事)。 – rolfl

1

這裏,您似乎試圖設置第一個PARAMETER元素的文本,該元素是第一個PARAMETER元素的子元素,該元素是root元素的第二個子元素的子元素。

Element rootNode = doc.getRootElement(); 
... 
Element typeContent = rootNode.getChildren().get(1); 
... 
Element node = typeContent.getChild("PARAMETER"); 
node.getChild("PARAMETER").setText("Bla"); 

沒有這樣的元素似乎存在於您的示例x​​ml中。

  1. typeContent對應於元件<OBJECT_TYPE>x2000</OBJECT_TYPE>,它沒有PARAMETER元件的兒童。

  2. 沒有PARAMETER元素是 PARAMETER元素的子元素。

更何況,出於某種原因,你似乎做了15次完全相同的事情。這是爲什麼?

+0

是的,我更新了代碼,但只要我試圖獲取我的父子列表 list = typeContent.getChildren(「param」);那麼它的空。像它不存在。但我deost存在時,我打印出來:System.out.println(「typeContent:」+ typeContent.getChildren()); – Sembrano

+0

你確定它是空的,不是一個空的列表? –

+0

它的輸出是這樣的:typeContent:[[Element:],[Element:],[元素:<參數[名稱空間:http://www.bombardier.com] />],[元素:<參數[名稱空間:http://www.bombardier.com] />],[元素:],[Element:],[Element:],[元素:<參數[名稱空間:http://www.bombardier.com] />],[元素:<參數,但它永遠不會獲取參數 – Sembrano

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()); 
}