我在更新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”);
答案 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
您的示例xml中似乎不存在此类元素。
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>
元素子元素。
没有PARAMETER
个元素属于
PARAMETER
元素。
更重要的是,出于某种原因,你似乎做了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());
}
}