Element Node 对象在 XML 解析后转换为 Text Node

Element Node object is converted to Text Node after XML parsing

我第一次 运行 这个程序我需要创建 xml,我首先创建文件并创建一个 Document 对象,然后将它转换为一个 Element 对象。

        xmlDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
        xmlDoc +="<head>";
        xmlDoc +=  "</head>";

        Document xmlFile =  XmlParser.parseXmlString(xmlDoc);
        Element element = xmlFile.getDocumentElement();

我已经用它的 NodeType 代码验证了这一点,但是当我创建父节点时它给了我 Element_Node == 1。我将这个节点附加到元素对象。

        Element newElement = xmlFile.createElement("parent");
        newElement.setAttribute("id", i);
        element.appendChild(newElement);

如果子元素还不是父元素的子元素,我会把它放在父元素中,我检查一下,如果它还不是子元素,我会创建一个新节点 class并给它文本内容。

            Node newChild = xmlFile.createElement("child");
            newChild.setTextContent(text);
            newElement.appendChild(newChild);

那我就用transformer保存这个文件。

 Transformer transformer = null;
        try {
            transformer = TransformerFactory.newInstance().newTransformer();
        } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
        DOMSource source = new DOMSource(xmlFile);
        StreamResult console = new StreamResult(System.out);
        try {
            transformer.transform(source, new StreamResult(new FileOutputStream(file.getPath())));
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

现在我第二次 运行 我将直接从这个文件解析程序。创建的 XML 文件具有以下结构

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<head>
<parent id="1">
<child>text1</child>
<child>text2</child>
<child>text3</child>
</parent>
<parent id="2">
<child>text1</child>
<child>text2</child>
</parent>
</head>

现在文件已创建,将读取文件然后解析以创建元素而不是硬编码字符串。

xmlDoc = this.readFile(file, Charset.forName("UTF-8"));
Document xmlFile =  XmlParser.parseXmlString(xmlDoc);
Element element = xmlFile.getDocumentElement();
...
 String readFile(File file, Charset charset) throws IOException {
        return new String(Files.readAllBytes(file.toPath()), charset);

现在的问题是父元素无法转换为元素并且具有 Text_Node 类型值 == 3。无法转换以下对象。

Element nextSib = (Element) element.getFirstChild();

我的想法是现在我可以通过遍历每个父节点将相关的子节点附加到父节点,这就是为什么我需要以元素形式获取它以便我可以使用 id 属性。但是我不能这样做,因为出于某种原因父节点被转换为文本节点。

当您在写树时使用缩进,元素节点之间会有白色 space,因此子节点可以是带有白色 space 的文本节点。如果您正在寻找第一个元素子节点,请使用 XPath *[1] 或简单地使用元素的名称 foo[1] 或者如果您想使用 childNodes 确保检查 nodeType 直到你有一个元素节点。