所以我正在编写一个解析XML文件的应用程序,该文件可能具有非常复杂的结构 - XSD很大(它是.trx测试结果文件的XSD),我正在尝试开发一套将处理文件可以拥有的每个可能节点集的类。
(顺便说一句,我知道我可以从Visual Studio附带的xsd.exe工具中生成它,但我发现代码难以阅读且难以维护。我想要更清洁和可维护的东西。)
我的问题是:这个XSD块究竟是如何转换为XML节点的?
XSD:
<xs:complexType name="TestSettingsType">
<xs:all>
<xs:element minOccurs="0" name="Description" />
<xs:element minOccurs="0" name="Deployment">
<xs:complexType>
<xs:complexContent mixed="false">
<xs:extension base="DeploymentItemsType">
<xs:attribute default="false" name="deploySatelliteAssemblies" type="xs:boolean" use="optional" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
其中DeploymentItemsType的定义如下:
<xs:complexType name="DeploymentItemsType">
<xs:sequence>
<xs:element name="DeploymentItem" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="filename" type="xs:string" use="required"/>
<xs:attribute name="outputDirectory" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
(我试图通过删除一些属性来清理它,因为我不希望这对于帖子来说太大了。)
我想出了两个选择。这是第一个:
<TestSettings>
<Description>Some description</Description>
<Deployment>
<DeploymentItems deploySatelliteAssemblies="false">
<DeploymentItem filename="some_file.txt" outputDirectory="some_output.txt" />
<DeploymentItem filename="some_file2.txt" outputDirectory="some_output2.txt" />
</DeploymentItems>
</Deployment>
</TestSettings>
这是第二个:
<TestSettings>
<Description>Some description</Description>
<Deployment deploySatelliteAssemblies="false">
<DeploymentItem filename="some_file.txt" outputDirectory="some_output.txt" />
<DeploymentItem filename="some_file2.txt" outputDirectory="some_output2.txt" />
</Deployment>
</TestSettings>
这两个中的一个是正确的,还是都错了?
我强烈怀疑第一个解决方案是正确的,但我似乎无法自己生成.trx文件来验证它(我已经使用vstest.console.exe和.testsettings尝试了我所知道的一切文件,没有运气)。所以,我必须手工生成潜在的XML。不过,我对XSD并不熟悉。
我正在为此编写一个API,我想尽可能多地涵盖我的可能情况 - 也就是说,如果它可以在一个文件中,我会喜欢能够解析它。