很抱歉,如果已经提出这个问题,我在网站上搜索了不同的解决方案,但没有找到适合我的问题的答案。我有像
这样的XML<Book>
<Action>NEW</Action>
<Attributes>
<Attribute>
<AttributeName>SwapBook</AttributeName>
<AttributeValue>A</AttributeValue>
</Attribute>
<Attribute>
<AttributeName>PricerKey</AttributeName>
<AttributeValue>TRADING</AttributeValue>
</Attribute>
</Attributes>
</Book>
我尝试编写用于将XML转换为平面CSV文件的代码,以返回所有标头名称。但我的代码只适用于第一级的项目。
private List<String> getHeaders(Document document) {
Element root = document.getDocumentElement();
NodeList list = root.getChildNodes();
List<String> headers = new ArrayList<String>();
for (int i=0; i< list.getLength(); i++) {
if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
Node node = list.item(i);
NodeList nodeList = node.getChildNodes();
int children = nodeList.getLength();
System.out.println("children="+children);
for (int k = 0; k < children; k++) {
if (nodeList.item(k).getNodeType() == Node.ELEMENT_NODE) {
headers.add(nodeList.item(k).getNodeName());
}
}
break;
}
}
return headers;
}
我在堆栈溢出How to get only the top level node's text content with getTextContent()上看到了一个帖子,这解释了为什么我无法达到大孩子/子级别标题名称/值。我只能打印Action
和Attribute
,但Attribute
和AttributeName
不可见。
真诚地感谢任何帮助。提前致谢。
答案 0 :(得分:1)
试试这个,它将循环遍历所有节点和子节点的所有子节点,
private List<String> getHeaders(Document document) {
Element root = document.getDocumentElement();
NodeList list = root.getChildNodes();
List<String> headers = new ArrayList<String>();
for (int i=0; i< list.getLength(); i++) {
if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
Node node = list.item(i);
addNode(node, headers);
break;
}
}
return headers;
}
private void addNode(Node node, List<String> headers)
{
NodeList nodeList = node.getChildNodes();
if(nodeList==null||nodeList.Length==0)return;
int children = nodeList.getLength();
for (int k = 0; k < children; k++) {
if (nodeList.item(k).getNodeType() == Node.ELEMENT_NODE) {
headers.add(nodeList.item(k).getNodeName());
addNode(nodeList.item(k), headers);
}
}
}
答案 1 :(得分:0)
我提出了以下解决方案,例如递归检查子节点。如果我能以某种方式改进代码,请建议我。
private void checkChildNodes(Node root){
if(root.hasChildNodes()){
NodeList list = root.getChildNodes();
int length = list.getLength();
for(int i = 0; i < length; i++){
if (list.item(i).getNodeType() == Node.ELEMENT_NODE) {
System.out.println(list.item(i).getNodeName());
checkChildNodes(list.item(i));
}
}
}
else{
System.out.println(root.getNodeName());
}
}
感谢。