Реструктуризация XML-файла - PullRequest
1 голос
/ 01 декабря 2010

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

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

Ответы [ 6 ]

1 голос
/ 01 декабря 2010

Это легко сделать, добавив один шаблон к преобразованию идентичности 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>
0 голосов
/ 01 декабря 2010

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

0 голосов
/ 01 декабря 2010

Мой XSLT-фу не подходит, но да, вы можете сделать это с помощью 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>

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

0 голосов
/ 01 декабря 2010

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

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

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

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

Для получения дополнительной информации см. Веб-сайт регулярный-экспресс-сайт.

0 голосов
/ 01 декабря 2010

Может быть, это может вам помочь?

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

0 голосов
/ 01 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...