从java中选定的XML元素中获取子元素及其值

时间:2015-01-09 14:27:48

标签: java xml

背景知识:

saveFilePath是用户已通过JFileChooser选择的位置

selectedElement是一个字符串,它是从组合框中选择的值

NodeList selectedElementList = doc.getElementsByTagName(selectedElement);返回在XML文件中找到的与从comboBox中选择的元素匹配的所有元素。

我尝试做的是从所选元素中获取所有子元素,例如获得元素A&乙

<selectedElement>
    <a> AA </a>
    <b> BB </b>
</selectedElement>
<selectedElement>
    <a> AB </a>
    <b> BC </b>
</selectedElement>

然后查找selectedElement的所有实例以及与其关联的所有子元素以打印到文件中。请注意selectedElement很可能是文档根元素的子元素。

这是我到目前为止所做的,fileWriter.append(a + "," + + newline);打印出XML文件中所有选定元素的出现,但我似乎无法弄清楚如何让它打印出子元素及其值。

这就是我所拥有的:

try {                   
                    // Make a file writer that uses the location entered
                    fileWriter = new FileWriter(saveFilePath);
                    fileWriter.append(selectedElement + "," + newline);

                    // For each occurance of the element
                    for (int k = 0; k < selectedElementList.getLength(); k++) {

                        // Add the value of it to the CSV file
                        String a = selectedElementList.item(k).getTextContent();
                        fileWriter.append(a + "," + newline);
//                      for (int l = 0; l < a.getLength(); l++) {
//                          
//                          
//                          String item = element.getNodeName().toString();
//                          String item2 = element.getNodeValue();
//                          
//                          System.out.println("The node name is: " + item + newline);
//                          System.out.println("The node VALUE is: " + item2 + newline);
//                      }                                           

                    }

                    // Close the fileWriter stream
                    fileWriter.flush();
                    fileWriter.close();

                    // Disable the create button and enable the open button
                    createButton.setEnabled(false);
                    openButton.setEnabled(true);

                } catch (IOException e) {
                    e.printStackTrace();
                }

也许我需要创建仅包含所需XML的第二个文档?或者getElementsByTagName不是正确的使用方法?我basicalla想要获取所选元素的子节点!

任何帮助将不胜感激

我发布了整件事,但它的长度为320行,这只是我小应用程序的众多部分之一:)

2 个答案:

答案 0 :(得分:0)

我想我有一个解决方案,使用名为&#34; dynamic data projection&#34; (披露:我是该项目的附属机构)。但我改变你的XML是有意义的(添加了根元素并给所选元素赋予了不同的名称,所以我可以选择其中一个)。这是我的XML版本:

<root>
    <selectedElement>
        <a> AA </a>
        <b> BB </b>
    </selectedElement>
    <selectedElement>
        <a> AB </a>
        <b> BC </b>
    </selectedElement>
</root> 

以下是该计划:

public class ExtractElement {

    public interface Projection {

        interface SelectedElement {
            @XBRead("name()")
            String getName();
            @XBRead(".")
            String getValue();
        }

        @XBRead("//{0}/*")
        List<SelectedElement> getSelectedElements(String name);
    }
    public static void main(String[] args) throws IOException {
        Projection projection = new XBProjector().io().url("resource://data.xml").read(Projection.class);        
        for (SelectedElement se:projection.getSelectedElements("selectedElement")) {
            System.out.println("Found element with name "+se.getName()+" and value "+se.getValue());
        }    
    }    
}

打印出来:

Found element with name a and value  AA 
Found element with name b and value  BB 
Found element with name a and value  AB 
Found element with name b and value  BC 

这是你喜欢的吗?

答案 1 :(得分:0)

通过执行以下操作来解决此问题:

// For each occurance of the element
                for (int k = 0; k < selectedElementList.getLength(); k++) {

                    // Add the value of it to the CSV file
                    String a = selectedElementList.item(k).getTextContent();
                    fileWriter.append(a + "," + newline);
                    //log.append(a + "," + newline);        


                    NodeList temp = selectedElementList.item(k).getChildNodes();
                    for(int l = 0; l < temp.getLength(); l++) {

                        Node tempNode = temp.item(l);

                        if (tempNode.hasChildNodes()) {

                            String tnodeName = tempNode.getNodeName();

                            log.append("tNodeName is: " + tnodeName.toString() + newline);
                        }
                    }               

                }