Попытка сгенерировать объекты для файла XML у меня - PullRequest
0 голосов
/ 24 марта 2011

У меня есть файл XML, мне нужно извлечь из него значения и поместить их в другой файл XML.

Вопросы:

  1. Другой человек создает «схему» для получающегося XML-файла. Есть ли что-то, что этот человек может дать мне, чтобы автоматизировать вставку значений? Нужно ли мне вообще что-то извлекать из XML или что-то вроде XSLT просто выполняет все преобразования?

  2. Есть ли проблема с этой структурой XML ниже? Я пытался использовать xsd2code для генерации объектов, но при использовании LoadFromFileMethod ничего не загружалось - я прочитал статью, которая не была очень конкретной, но в которой говорилось, что «вложенные родители» вызывают проблемы для XSD.exe и xsd2code.

<Section>
<Form id="1"...>
<Control id="12523"..> <--Some have this some don't
  <Property name="Color">Red</Property>
  <Property name="Size">Large</Property>
</Control>
</Form>
<Form id="2"...>
  <Property name="Color">Blue</Property>
  <Property name="Size">Large</Property>
</Form>
<Form id="3"...>
  <Property name="Color">Red</Property>
  <Property name="Size">Small</Property>
</Form>
</Section>

Спасибо за любые советы!

Ответы [ 4 ]

2 голосов
/ 24 марта 2011

XSLT - инструмент для преобразования XML.

Что касается вашего XML, во многих приложениях вы должны заменить это:

<Property name="Color">Red</Property>

с:

<Color>Red</Color>

Некоторые причины:

  1. Если вы хотите написать схему, которая каким-либо образом ограничивает содержимое элемента (например, одним из списка значений), элемент должен идентифицироваться по его имени; Вы не можете написать одну схему для элемента Property с атрибутом name, равным «Color», и другой схемой для элемента Property, атрибут name которого равен «Size».

  2. Проще писать предикаты XPath, если имена ваших элементов значимы. Например, Form[Color = 'Red'] намного проще писать (и читать), чем Form[Property[@name='Color' and .='Red']]

  3. Вышесказанное также верно, если вы пишете запросы Linq к XML, почти таким же образом. Сравните Element.Descendants("Color") с Element.Descendents("Property").Where(x => x.Attributes["name"] == "Color").

Существуют приложения, в которых также целесообразно иметь элементы с общим именем; приведенный выше аргумент не является окончательным. Но если вы собираетесь это сделать, у вас должны быть веские причины.

1 голос
/ 24 марта 2011

Я бы использовал для этого XSLT, вот небольшой пример для начала.

Скопируйте этот пример кода в пустой проект c #:

static void Main(string[] args) {
    const string xmlPath = "source.xml";
    const string xslPath = "transform.xsl";
    const string outPath = "out.xml";

    try {
        //load the Xml doc
        var xmlDoc = new XPathDocument(xmlPath);

        //load the Xsl 
        var xslDoc = new XslCompiledTransform();
        xslDoc.Load(xslPath);

        // create the output file
        using (var outDoc = new XmlTextWriter(outPath, null)) {
            //do the actual transform of Xml
            xslDoc.Transform(xmlDoc, null, outDoc);
        }
    }
    catch (Exception e) {
        Console.WriteLine("Exception: {0}", e.ToString());
    }
}

Запишите приведенный выше пример xml-кода в файл source.xml и поместите следующий xsl-код в файл transform.xsl:

<?xml version="1.0" ?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="xml" />
<xsl:template match="/">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="Section">
    <OtherSection>
        <xsl:apply-templates />
    </OtherSection>
</xsl:template>

<xsl:template match="Form">
    <OtherForm>
        <xsl:attribute name="id">
            <xsl:value-of select="@id" />
        </xsl:attribute>
        <xsl:apply-templates />
    </OtherForm>
</xsl:template>

<xsl:template match="Control">
    <OtherControl>
        <!-- converts id attribute to an id tag -->
        <id>
            <xsl:value-of select="@id" />
        </id>
        <xsl:apply-templates />
    </OtherControl>
</xsl:template>

<xsl:template match="Property">
    <OtherProperty>
        <!-- converts name attribute to an id attribute -->
        <xsl:attribute name="id">
            <xsl:value-of select="@name" />
        </xsl:attribute>
        <xsl:value-of select="."/>
    </OtherProperty>
</xsl:template>

</xsl:stylesheet>

Полученный файл out.xml должен дать вам представление о том, как xsl выполняет свою работу, и, надеюсь, поможет вам начать работу.

Для получения дополнительной информации о XSLT обратитесь к учебнику по W3Schools.

1 голос
/ 24 марта 2011

XSLT, вероятно, является решением, если вы просто хотите преобразовать его, но если вам нужно что-то сделать со значениями в коде, то LINQ to Xml значительно облегчит вашу задачу.

1 голос
/ 24 марта 2011

XLST - лучший способ трансформировать XML из одной схемы в другую. Это именно то, что он был построен, чтобы сделать. http://w3schools.com/xsl/default.asp - отличный учебник по XSLT. Все, что вам действительно нужно, это схема или несколько примеров его xml для написания вашего xslt-файла.

Кроме того, ваш xml выглядит хорошо / правильно для меня.

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