【问题标题】:stax to DOM converterstax 到 DOM 转换器
【发布时间】:2011-05-02 15:13:07
【问题描述】:

我想使用 Stax 流阅读器读取 DOM 文档并使用 Stax 流编写器编写它。 我想修改 xml 文件并更改一些元素值 在构建 dom 树之前,我希望光标指向 xml 文件中的某个元素 我写了这段代码,但是xml文件没有修改 谁能帮帮我?

FileInputStream 输入 = new FileInputStream("cv.xml"); XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(input); BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    //-*-*- get new entries from input stream
    System.out.println("<< CV >>\n -> Modify the first reference\n    ** Modify The Name **");
    System.out.print("    Enter degree : ");
    String degree = in.readLine();
    System.out.print("    Enter first name : ");
    String fName = in.readLine();
    System.out.print("    Enter last name : ");
    String lName = in.readLine();
    System.out.println("    ** Modify The Address ** ");
    System.out.print("    Enter new city : ");
    String newCity = in.readLine();
    System.out.print("    Enter new country : ");
    String newCountry = in.readLine();

    //-*-*- let the reader point at the first "reference" element
    int eventType;
    boolean ref = false, fname = false;
    while (reader.hasNext()) {
        eventType = reader.next();
        switch (eventType) {
            case XMLEvent.START_ELEMENT:
                if (reader.getLocalName().equalsIgnoreCase("references"))
                    return;
        }
    }
    //-*-*- build DOM trees using Stax stream reader
    Document doc = new DOMConverter().buildDocument(reader);
    reader.close();
    input.close();
    //-*-*- start modification
    Element firstRef = (Element)doc.getElementsByTagName("reference").item(0);
    NodeList name = (NodeList)firstRef.getElementsByTagName("name");
    //-*-*- modify the degree (Dr. , Eng. , Dev. ,etc)
    Attr att = (Attr)name.item(0).getAttributes().item(0);
    ((Node)att).setNodeValue(degree);
    //-*-*- modify first name
    NodeList firstName = (NodeList)firstRef.getElementsByTagName("fname");
    NodeList firstNameChilds = (NodeList)firstName.item(0).getChildNodes();
    ((Node)firstNameChilds.item(0)).setNodeValue(fName);
    //-*-*- modify last name
    NodeList lastName = (NodeList)firstRef.getElementsByTagName("lname");
    NodeList lastNameChilds = (NodeList)lastName.item(0).getChildNodes();
    ((Node)lastNameChilds.item(0)).setNodeValue(lName);
    //-*-*- modify city
    NodeList city = (NodeList)firstRef.getElementsByTagName("city");
    NodeList cityChilds = (NodeList)city.item(0).getChildNodes();
    ((Node)cityChilds.item(0)).setNodeValue(newCity);
    //-*-*- modify country
    NodeList country = (NodeList)firstRef.getElementsByTagName("country");
    NodeList countryChilds = (NodeList)country.item(0).getChildNodes();
    ((Node)countryChilds.item(0)).setNodeValue(newCountry);

    //-*-*- write DOM document
    FileOutputStream out = new FileOutputStream("cv.xml");
    XMLStreamWriter sw = XMLOutputFactory.newInstance().createXMLStreamWriter(out);

    new DOMConverter().writeDocument(doc, sw);
    sw.close();
    out.close();

【问题讨论】:

    标签: java


    【解决方案1】:

    这可能是因为您在找到“references”元素时正在返回。也许break 就是你的意思。

    【讨论】:

    • 不,我的意思是返回,我想在 XMLStreamReader 匹配“references”元素时停止 while 循环。所以,dom 树就是从这个元素开始的
    • Return 将退出整个方法。我很确定您希望break 退出该while 循环。尝试在该循环之后添加一些调试语句,您就会明白我的意思了。
    • 是的,return 是对的,但是当我使用 break 时,它会退出开关,但在光标匹配引用元素后仍处于循环中,并将到达文档末尾
    • 对,所以你需要一个更好的循环控制变量。尝试一个开始为假的布尔值,当你找到references 时设置为真。您仍然需要检查reader.hasNext()
    • 我试过这个:int eventType;布尔 ref = 假,fname = 假; while (reader.hasNext()) { eventType = reader.next(); switch (eventType) { case XMLEvent.START_ELEMENT: if (reader.getLocalName().equalsIgnoreCase("references")) { ref = true;休息; } } if(ref) 中断; } System.out.println("我在这里");
    猜你喜欢
    • 2012-12-05
    • 2017-04-01
    • 2014-06-30
    • 2013-05-24
    • 2015-01-13
    • 2012-07-05
    • 1970-01-01
    • 2013-06-02
    • 2011-02-01
    相关资源
    最近更新 更多