XML Deserialization из XSD с переменными элементами XML
-
10-10-2019 - |
Вопрос
Мне дали файл 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 или Source XML каким -либо образом, так как они производятся крупными производителями.
Дайте мне знать, если вам нужно больше информации.
Спасибо! Брэд
Решение
Извините, XSD.Exe и XML -сериализация не будут иметь дело с XML.
XML такого рода создается потому, что кто -то думает, что людям должно быть легко читать и вводить. Они не думают о том, смогут ли машины их использовать. Это ошибка, за которую вам придется заплатить.
Лучшее, что вы могли бы сделать, - это создать XSLT, который поместит элементы в какой -то канонический заказ, а затем создаст XSD, представляющий этот порядок, и создать классы из XSD.
Другие советы
Как только у вас есть XSD, вы можете использовать набор данных вместо считывателя XML. Тогда есть несколько автоматических методов, созданных для проверки нулей, как показано в приведенном ниже примере.
например. Это в примере, где Calcualtionanalysisds является XSD.
CalcualtionAnalysisDS ds = new CalcualtionAnalysisDS();
ds.ReadXml("calc.xml");
foreach (CalcualtionAnalysisDS.ReportRow row in ds.Report.Rows)
{
if (row.IsBestSHDSLDesignClassNull)
{
}
}