存在简单修改的​​XML实用程序类 - 添加,删除/删除,更改/修改?

时间:2013-05-16 14:25:57

标签: java xml xml-parsing

是否存在具有以下客户端代码中显示的功能的Java库?我正在寻找一个使用字符串提供基本XML操作功能的库。

MagicXml mXml = MagicXmlUtil.createXml("<team name='cougars'><players><player name='Michael'/></players></team>");
mXml.addNode("players", "<player name='Frank'/>");
mXml.addNode("players", "<player name='Delete Me'/>");
mXml.removeNode("player[@name='Delete Me']");
mXml.addAttribute("team[@name='cougars']", "city", "New York");
mXml.addAttribute("team[@name='cougars']", "deleteMeAttribute", "Delete Me");
mXml.removeAttribute("team[@name='cougars']", "deleteMeAttribute");
mXml.modifyAttribute("player[@name='Michael']", "name", "Mike");
mXml.setNodeValue("player[@name='Mike']", "node value for Mike");
MagicXmlNode node = mXml.getNode("<player[@name='Frank'/>");
mXml.addNode("players", node);
mXml.modifyAttribute("player[@name='Frank'][1]", "name", "Frank2");
System.out.println("mXml:\n" + mXml.toString());

mXml:
<team name='cougars' city="New York">
    <players>
        <player name='Mike'>
            node value for Mike
        </player>
        <player name='Frank' />
        <player name='Frank2' />
    </players>
</team>

3 个答案:

答案 0 :(得分:1)

有许多不同的java库用于xml操作/编辑,如果你的初学者很难使用java标准库的基础知识,那么你应该尝试使用JDOM(java文档对象模型)进行解析和编辑很容易。 如果您想尝试http://www.jdom.org/祝你好运=)

,请阅读一些文档并下载示例代码

答案 1 :(得分:0)

你是否使用像dom4j或jdom这样的东西,或者正如我在评论中所说,你创建了一个简单的类,它包含调用使用XPath查找节点并添加/删除你想要的东西(节点,属性等)。

这是一个示例课程,我会让你添加遗漏的内容(modifyAttributesetNodeValue等)

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class MagicXml {
    static XPath xpath = XPathFactory.newInstance().newXPath();
    Document doc;
    Element root;

    public MagicXml(String xml) throws Exception {
        doc = parseXml(xml);
        root = doc.getDocumentElement();
    }

    private static Document parseXml(String xml) throws Exception {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        ByteArrayInputStream bis = new ByteArrayInputStream(xml.getBytes());
        return docBuilder.parse(bis);
    }

    private String asXPath(String path) {
        return path.startsWith("/") ? path : "//" + path;
    }

    private static Node findNode(Document doc, String xPath) throws Exception {
        XPathExpression expr = xpath.compile(xPath);
        return (Node) expr.evaluate(doc, XPathConstants.NODE);
    }

    public static MagicXml createXml(String xml) throws Exception {
        return new MagicXml(xml);
    }

    public MagicXml addNode(String path, String xml) throws Exception {
        Document subDoc = parseXml(xml);
        Node destNode = findNode(doc, asXPath(path));
        Node srcNode = subDoc.getFirstChild();
        destNode.appendChild(doc.adoptNode(srcNode.cloneNode(true)));
        return this;
    }

    public MagicXml removeNode(String path) throws Exception {
        Node destNode = findNode(doc, asXPath(path));
        destNode.getParentNode().removeChild(destNode);
        return this;
    }

    public MagicXml addAttribute(String path, String attr, String value) throws Exception {
        Element destNode = (Element)findNode(doc, asXPath(path));
        destNode.setAttribute(attr, value);
        return this;
    }

    public MagicXml removeAttribute(String path, String attr) throws Exception {
        Element destNode = (Element)findNode(doc, asXPath(path));
        destNode.removeAttribute(attr);
        return this;
    }

    public String docToString(Document doc) {
        try {
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
            StringWriter sw = new StringWriter();
            transformer.transform(new DOMSource(doc), new StreamResult(sw));
            return sw.toString();
        } catch (Exception e) {
            return "";
        }
    }

    public String toString() {
        return docToString(doc);
    }

    public static void main(String[] args) throws Exception {
        System.out.println(//
                MagicXml.createXml("<team name='cougars'><players><player name='Michael'/></players></team>")//
                .addNode("players", "<player name='Frank'/>")//
                .addNode("players", "<player name='Delete Me'/>")//
                .removeNode("player[@name='Delete Me']") //
                .addAttribute("player[@name='Frank']", "foo", "bar") //
                .addAttribute("player[@name='Frank']", "bar", "bazz") //
                .removeAttribute("player[@name='Frank']", "bar") //
                .toString());
    }
}

答案 2 :(得分:-1)

XStream是一个非常简单的XML操作工具。它可以很容易地从java类转换为XML,反之亦然。