【问题标题】:Splitting XML into multiple xml files将 XML 拆分为多个 xml 文件
【发布时间】:2011-09-20 19:06:57
【问题描述】:

我有一个 XML 文件,其中包含多张图片的数据,例如 GPS 坐标、日期/时间,以及一些需要拆分为多个 XML 文件的图像数据。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
    <Placemark>
        <name> //picture 1 info <name>
        <Point>
            <coordinates> //gps 1 cords <coordinates>
        <Point>
    <Placemark>
    <Placemark>
        <name> //picture 2 info <name>
        <Point>
            <coordinates> //gps 2 cords <coordinates>
        <Point>
    <Placemark>
<Document>

我希望它看起来像这样:

File 1:
<Placemark>
<Name> //picture 1 info <name>
<Point>
    <coordinates> //gps 1 cords <coordinates>
<Point>
<Placemark>

File 2:
<Placemark>
<Name> //picture 2 info <name>
<Point>
    <coordinates> //gps 2 cords <coordinates>
<Point>
<Placemark>

.....我读了这个问题: Split XML in Multiple XML files

并在导入所有内容后尝试为我的文件稍微修改代码。想知道是否有人对如何修改我的代码以进行上述问题中的吐痰有任何好主意。

【问题讨论】:

  • 确保正确关闭标签,即&lt;Point&gt;&lt;/Point&gt;
  • 您已将此标记为 Android... 您正在使用什么语言/系统进行编码?或者你只是在Java中做它?还是 C#?
  • @Tyler Ferraro 我正在用 Java 编写它,但我将在未来将其实现到 Android 应用程序中
  • 了解 XML 的基础知识。您没有使用结束标签。网上有数以百万计的 XML 教程,所以没有任何理由在问题中展示这种损坏的 XML。

标签: java android xml xml-parsing


【解决方案1】:

在 XSLT 2.0 中非常简单:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*">
    <xsl:copy><xsl:apply-templates/></xsl:copy>
  </xsl:template>
  <xsl:template match="Placemark">
    <xsl:result-document href="Placemark{position()}.xml">
      <xsl:next-match/>
    </xsl:result-document>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

    【解决方案2】:

    这是在 Android 上编程时可以使用的基本结构。这将从 Web 地址 (R.string.XmlUrlAddress) 打开一个 xml 文件。然后它会解析字符串并写入另一个文件,可能存储在您的 Android 设备上?

    注释区域是我没有编写的代码,而不是关于代码在做什么的 cmets。我不想花时间查找应该非常简单的文件 io 代码。

    URL url = new URL(getString(R.string.XmlUrlAddress));
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new InputSource(url.openStream()));
    doc.getDocumentElement().normalize();
    
    NodeList nodeList = doc.getElementsByTagName("Placemark");
    String[] files = new String[nodeList.getLength()];
    
    for (int i=0; i < nodeList.getLength(); i++) {
        files[i] = "file" + i + ".xml";
        //Create and open files[i] file.
        //Write opening tag.  "<Placemark>"
    
        Node node = nodeList.item(i);
        Element element = (Element)node;
    
        NodeList nameList = element.getElementsByTagName("name");
        Element name = (Element)nameList.item(0);
        nameList = name.getChildNodes();
        String name = nameList.item(0).getNodeValue();
        //Write name to file.  "<name>" + name + "</name>"
    
        NodeList pointList = element.getElementsByTagName("Point");
        String[] points = new String[pointList.getLength()];
    
        //Write opening Points tag. "<Points>"
        for (int j=0; j < pointList.getLength(); j++) {
            Node cNode = pointList.item(j);
            Element cElement = (Element)cNode;
    
            NodeList coordinateList = element.getElementsByTagName("coordinates");
            Element coordinateElement = (Element)coordinateList.item(0);
            coordinateList = coordinateElement.getChildNodes();
            points[j] = coordinateList.item(0).getNodeValue();
    
            //Write points[j] to file. "<coordinates>" + points[j] + "</coordinates>"
        }
        //Write end Points tag.  "</Points>"
        //Write end document tag.  "</Placemark>"
        //Close file
    }
    

    【讨论】:

    • 恭喜您回答了一个 5 岁的问题并对此保持谦虚。
    【解决方案3】:

    可能有更好的方法,但是您可以查看 SAX XML 解析器,然后解析到要剪切文件的位置,然后剪切文件(确保以正确的标签结尾,然后为下一个文件再次启动标签,否则您将有 2 个无效的 xml 文件)。

    【讨论】:

      【解决方案4】:

      这是一个非常古老的问题,但也许这会对某人有所帮助。在 SO 中有很多答案等,所以我尝试制作一些通用的东西。 Here 是我的简单 SWING 应用程序,它救了我。我有一个巨大的文件,其中 PRODUCT 作为根元素,Products 作为项目元素。因此,如果有人需要加载结构,选择根元素(将在所有文件中)和将被根元素包围的项目元素,这可以帮助你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多