1

我得到了一个代表大量元素和相关属性的 XSD 文件。我使用 xsd.exe 创建了一个 CS 类。

问题是创建的 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 文件,因为它们是由主要制造商生产的。

如果您需要更多信息,请与我们联系。

谢谢!布拉德

4

2 回答 2

2

抱歉,XSD.EXE 和 XML 序列化不会像那样处理 XML。

创建这种性质的 XML 是因为有人认为人类应该很容易阅读和输入。他们不考虑机器是否能够使用它们。这是一个错误,你现在必须为此付出代价。

您可以做的最好的事情是创建一个 XSLT,它将元素放置到一些规范的顺序中,然后创建一个表示该顺序的 XSD 并从 XSD 创建类。

于 2011-01-12T04:15:09.060 回答
0

Once you have an XSD you could use the dataset instead of the XML Reader. Then there are a few automatic methods created to check nulls as seen in the below example.

eg. This in an example where CalcualtionAnalysisDS is the XSD.

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

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

            }
        }
于 2011-01-12T01:08:11.603 回答