Копировать части файла XML на основе значения атрибута - PullRequest
2 голосов
/ 14 октября 2011

У меня большой XML-файл, и мне необходимо создать частичную «копию» этого файла.(Использование C #) Мне нужно сохранить ту же структуру xml, но мне нужны только те части, где условие имеет значение «true».

Пример структуры:

<?xml version="1.0" encoding="utf-8"?>
<country name="Netherlands">
    <region name="NH">
        <city name="Aalsmeer">
            <district name="Some district">
            <part type="slum" />
            </district>
            <contact adres="StreetName" telephone="0000000000" valid="false" />
            <residents number="10000" />
            <homes number = "7000" />
        </city>
        <city name="Heemskerk">
            <district name="Some district">
                <part type="workersDistrict" />
            </district>
            <contact adres="StreetName" telephone="0000000000" valid="true" />
            <residents number="10000" />
            <homes number = "7000" />
        </city>
        </region>
        <region name="ZH">
            <city name="Rotterdam">
                <district name="Some district">
                <part type="workersDistrict" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="true" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
            <city name="Moerdijk">
                <district name="Some district">
                    <part type="residential area" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="false" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
            </region>
</country>

Мне нужна только 'city ​​'элементы, где атрибут' valid 'равен' true '.Новый XML-файл должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
    <country name="Netherlands">
        <region name="NH">
            <city name="Heemskerk">
                        <district name="Some district"
                    <part type="workersDistrict" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="true" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
        </region>
        <region name="ZH">
            <city name="Rotterdam">
                <district name="Some district"
                    <part type="workersDistrict" />
                </district>
                <contact adres="StreetName" telephone="0000000000" valid="true" />
                <residents number="10000" />
                <homes number = "7000" />
            </city>
        </region>
    </country>

Как мне сделать это как можно быстрее (с учетом количества элементов города (например, 100630) и размера файла (например, 63,0)MB)

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Используя модифицированное преобразование идентичности , вы можете просто сопоставить элементы, которые хотите подавить, и предоставить пустой шаблон.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output indent="yes" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!--suppress any city elements that do not have contact/@valid='true' -->
    <xsl:template match="city[not(contact/@valid='true')]" />

</xsl:stylesheet>

Вы можете выполнить XSLTв C # вот так :

using System;
using System.Xml;
using System.Xml.Xsl; 
namespace XSLTransformation
{
    /// Summary description for Class1.
    class Class1
    {
        static void Main(string[] args)
        {
            XslTransform myXslTransform; 
            myXslTransform = new XslTransform();
            myXslTransform.Load("books.xsl"); 
            myXslTransform.Transform("books.xml", "ISBNBookList.xml"); 

        }
    }
}
0 голосов
/ 14 октября 2011

Я предлагаю вам проверить linq to xml:

Пример: http://jesseliberty.com/2011/02/15/linq-to-xml/

MSDN: http://msdn.microsoft.com/en-us/library/bb387098.aspx

...