Реструктуризация XML-файла

У меня есть клиент, который хотел бы, чтобы к его регистрационной форме был добавлен раскрывающийся список, в котором перечислены все провинции мира по их коду страны. Для этого он дал мне этот файл. К сожалению, структура данных не подходит для того, что мне нужно. Ниже представлена ​​структура, которую я хотел бы иметь. Есть ли способ автоматически реструктурировать данные, возможно, используя XSLT или что-то подобное? Спасибо!

<countries>
  <country code="US">
    <region>Alaska</region>
    <region>California</region>
  </country>
</countries>

person Leedsoft Solutions    schedule 01.12.2010    source источник


Ответы (6)


Это легко сделать, добавив один шаблон в преобразование идентификатора XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="xml" indent="yes"/>

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

   <xsl:template match="countries/*">
       <country code="{name()}">
          <xsl:apply-templates select="region"/>
       </country>
   </xsl:template>

</xsl:stylesheet>
person Robert Rossney    schedule 01.12.2010
comment
Спасибо Мерф и Роберту! Я введу этот фрагмент кода на случай, если он понадобится мне в будущем. - person Leedsoft Solutions; 01.12.2010

Если бы мне пришлось преобразовать этот файл, я бы просто написал быстрое вспомогательное консольное приложение, десериализовал текущий файл в объект, соответствующий текущему формату, а затем просто запустил цикл и перетащил данные в новую иерархию объектов, соответствующую вашему новый формат, указанный выше, а затем сериализуйте его обратно в XML.

Таким образом, если мне когда-либо придется повторно импортировать тот же файл, я могу просто повторно запустить свое приложение преобразования.

person Bob Palmer    schedule 01.12.2010

Может это вам поможет?

Преобразование структуры XML

person Mattias    schedule 01.12.2010

Вы можете использовать свой любимый инструмент регулярных выражений для преобразования файла. Например, в .NET вы можете использовать:

string result = Regex.Replace(Regex.Replace(input, "<(..)>", "<country code=\"$1\">"), "</..>", "</country>");

$ 1 относится к строке, совпадающей с первой совпадающей группой «(..)».

Вот ваш преобразованный файл

Посетите веб-сайт regular-expressions.info для получения дополнительной информации.

person Orlin    schedule 01.12.2010

Мой XSLT-fu не для этого, но да, вы можете сделать это с помощью XSLT.

На самом деле вы всего лишь пытаетесь сделать одну умную вещь - преобразовать теги кода страны в теги.

Легко перебирать список дочерних элементов конкретного узла, вы можете получить имя тега текущего узла и вывести более или менее все, что захотите ... где я не уверен (это не то, что я когда-либо приходилось делать) - это точное заклинание для извлечения имени узла.

Изменить: слишком хороший вопрос, чтобы отпустить его (возможность обучения)

Недостающий бит ответа, конечно же, находится в stackoverflow < / а>

Итак, это дает вам следующее (на основе того, что я знаю ... я уверен, что копию регионов можно упростить, но я не знаю, как!):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates select="countries" />

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

    <xsl:template match="countries">
        <countries>
            <xsl:for-each select="child::*">
                <country code="{local-name()}">
                    <xsl:apply-templates select="region" />
                </country>
            </xsl:for-each>
        </countries>
    </xsl:template>

    <xsl:template match="region">
        <region>
            <xsl:value-of select="."/>
        </region>
    </xsl:template>

</xsl:stylesheet>

Предложения по улучшению приветствуются - при необходимости внесу поправки!

person Murph    schedule 01.12.2010

Я должен был сначала проверить здесь ответы (не получил уведомление по электронной почте), но мне удалось написать небольшую программу ASP / VB для этого. Спасибо вам, ребята, за ваши ответы! Если бы я сначала проверил здесь, я бы сэкономил время. По крайней мере, у меня есть программа, которую я могу использовать повторно.

person Leedsoft Solutions    schedule 01.12.2010