Десериализация XML из XSD с переменными элементами XML - PullRequest
1 голос
/ 12 января 2011

Мне дали XSD-файл, который представляет огромное количество элементов и связанных атрибутов.Я создал класс CS с помощью xsd.exe.

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

Пример XML:

<App action="A" id="1" validate="yes"><ProductType id="5885"/><SpecType id="221"/><Qty>1</Qty><PartType id="7212"/><Part>456789</Part></App>
<App action="A" id="2" validate="yes"><ProductType id="5883"/><Qty>1</Qty><PartType id="7211"/><Part>132465</Part></App>

Тогда в моем коде:

protected static void ImportProduct(string filename)
{
var counter = 0;
var xSerializer = new XmlSerializer(typeof(ProductList));
var fs = new FileStream(String.Format("{0}{1}", FilePath, filename), FileMode.Open);
var reader = XmlReader.Create(fs);
var items = (ProductList)xSerializer.Deserialize(reader);

foreach (var record in items.App)
{
    counter++;

    Console.Write(String.Format("{0}{1}", record.ProductType.id, Environment.NewLine));
    Console.Write(String.Format("{0}{1}", record.Part.Value, Environment.NewLine));

    *if (!record.SpecType.Value.Equals(null))
        Console.Write(String.Format("{0}{1}", record.SpecType.id, Environment.NewLine));
    else
        Console.Write(String.Format("{0}{1}", "No SpecType!", Environment.NewLine));

    if (counter == 10)
        break;
}

}

Поэтому мой вопрос заключается в том, как я могу проверить наличие пустого / несуществующего элемента в соответствии со звездочкой (*) в строке выше.

Я не могу изменить xsd или исходные XML-файлы, так как они производятся крупными производителями.

Дайте мне знать, если вам нужна дополнительная информация.

Спасибо!Бред

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Извините, XSD.EXE и XML-сериализация не будут иметь дело с XML подобным образом.

XML такого типа создан, потому что кто-то считает, что людям должно быть легко читать и печатать. Онине думайте о том, смогут ли машины их использовать.Это ошибка, за которую теперь вам придется заплатить.

Лучшее, что вы можете сделать, - это создать XSLT, который поместит элементы в некоторый канонический порядок, затем создать XSD, представляющий этот порядок, и создать классыиз XSD.

0 голосов
/ 12 января 2011

Если у вас есть XSD, вы можете использовать набор данных вместо XML Reader.Затем есть несколько автоматических методов, созданных для проверки нулей, как показано в примере ниже.

например.Это в примере, где CalcualtionAnalysisDS является XSD.

        CalcualtionAnalysisDS ds = new CalcualtionAnalysisDS();
        ds.ReadXml("calc.xml");

        foreach (CalcualtionAnalysisDS.ReportRow row in ds.Report.Rows)
        {
            if (row.IsBestSHDSLDesignClassNull)
            {

            }
        }
...