将XML拆分为多个xml文件

时间:2011-06-22 22:26:49

标签: java android xml xml-parsing

我有一个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

并尝试在导入所有内容后为我的文件稍微修改一下代码。想知道是否有人对如何修改我的代码进行吐痰有任何好的想法,就像上面的问题一样。

4 个答案:

答案 0 :(得分:3)

在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>

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

注释区域是我没有写的代码,而不是代码正在做什么的评论。我不想花时间查找文件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
}

答案 3 :(得分:0)

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