有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将部分XML复制到新的XML文件?

有人知道如何将XML文件的一部分复制到新的XML文件中吗?我有这个:

<?xml version="1.0"?><!DOCTYPE svg  PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 500 401" height="401px" style="stroke: #818181;stroke-width: 1;stroke-linecap: round;stroke-opacity: 0.25;fill: #f4f3f0;" contentStyleType="text/css" zoomAndPan="magnify" preserveAspectRatio="xMidYMid meet" width="500px" enable_background="new 0 0 500 401" contentScriptType="application/ecmascript" version="1.1"><defs></defs><metadata><views><view w="500" zoomAndPan="magnify" preserveAspectRatio="xMidYMid meet" padding="0" h="401"><proj id="laea" lon0="16.693" lat0="45.723"></proj><bbox w="51.2" y="989.82" h="50.8" x="972.4"></bbox><llbbox lon1="180" lon0="-180" lat0="-90" lat1="90"></llbbox></view></views></metadata>
<g>
<path data-name="" d=" " data-fips=""></path>
<path data-name="" d="" data-fips=""></path>
</g>
</svg>

我想复制g标签中除了数据以外的所有内容,我该怎么做?谁能给我看看密码吗


共 (4) 个答案

  1. # 1 楼答案

    您可以通过两种方式实现这一点

    1。XSLT:

    在这里,您可以消除每个节点的节点<g>thru

    2。FileInputStream:

    在检查行包含字符串<g>并跳过它之前,逐行读取文件并写入新文件

  2. # 2 楼答案

    您可能正在寻找XSLT。它是一个java技术/库,允许您定义从一个xml结构到另一个xml结构的转换。它支持可重复的批处理操作和强大的动态语言,可以设置变量、使用条件语言等。您可以从命令行或其他应用程序内部运行它

    http://en.wikipedia.org/wiki/XSLT

  3. # 3 楼答案

    虽然可以使用XSLT实现这一点,但下面是使用标准JavaAPI(使用DOM)实现这一点的方法

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(/* get an InputStream of your data */);
    Element root = document.getDocumentElement();
    NodeList children = root.getElementsByTagName("g");
    for (int i = 0; i < children.getLength(); ++i) {
        Node child = children.item(i);
        root.removeChild(child);
    }
    Transformer tr = TransformerFactory.newInstance().newTransformer();
    StreamResult result = new StreamResult(/* Get an OutputStream to write to */);
    DOMSource source = new DOMSource(document);
    tr.transform(source, result);
    

    这样做可以避免正则表达式的脆弱性(这在这种特定情况下适用,但如果您需要开始变得更高级,它们将很快在XML中失控),并减少您对输入格式的假设

  4. # 4 楼答案

    在您的情况下,简单的正则表达式替换就足够了:

    final String svmXML = "<?xml....."; // your XML here
    final String svmXMlWithoutG = svmXML.replaceAll ("\\<g\\>(?s).*\\</g\\>", ""));
    

    除非你在某处使用CDATA