XML转换为CSV子节点的子节点

时间:2015-02-27 20:45:34

标签: java xml csv

很抱歉,如果已经提出这个问题,我在网站上搜索了不同的解决方案,但没有找到适合我的问题的答案。我有像

这样的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()上看到了一个帖子,这解释了为什么我无法达到大孩子/子级别标题名称/值。我只能打印ActionAttribute,但AttributeAttributeName不可见。

真诚地感谢任何帮助。提前致谢。

2 个答案:

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

感谢。