0

是否存在具有以下客户端代码中所示功能的 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>
4

3 回答 3

1

有许多不同的用于 xml 操作/编辑的 java 库,如果您是初学者,则很难使用带有 java 标准库的基础知识,因此您应该尝试使用 JDOM(Java 文档对象模型)来轻松进行解析和编辑。如果您想尝试http://www.jdom.org/ ,请阅读一些文档并在此处下载示例代码,祝您好运 =)

于 2013-05-16T14:37:58.913 回答
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());
    }
}
于 2013-05-16T16:52:26.343 回答
-1

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

于 2013-05-16T14:54:24.367 回答