我想将一些XML数据读入DataTable - 使用ReadXml类似的方法
var dataTable = new DataTable();
XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString));
dataTable.ReadXml(xmlReader);
Run Code Online (Sandbox Code Playgroud)
请参阅下面的XML字符串.XML包含模式定义,当数据没有命名空间(即在全局命名空间中)时,一切都很好,但是我无法弄清楚如何指定模式和XML,以便XML数据元素在另一个命名空间中.
我得到的例外是"DataTable"cd:Motorcycles'与源中的任何DataTable都不匹配.
我知道我正在犯一些非常愚蠢的男生错误,但我现在已经把头发拉了一个小时左右 - 摆弄没有成功.
有人能让我把我从痛苦中解救出来吗?
有效的XML
<NewDataSet xmlns="">
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Motorcycles" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Motorcycles">
<xs:complexType>
<xs:sequence>
<xs:element name="Manufacturer" type="xs:string" minOccurs="0" />
<xs:element name="PercentageOfRiders" type="xs:int" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Motorcycles>
<Manufacturer>Honda</Manufacturer>
<PercentageOfRiders>23</PercentageOfRiders>
</Motorcycles>
<Motorcycles>
<Manufacturer>Yamaha</Manufacturer>
<PercentageOfRiders>15</PercentageOfRiders>
</Motorcycles>
<Motorcycles>
<Manufacturer>Suzuki</Manufacturer>
<PercentageOfRiders>16</PercentageOfRiders>
</Motorcycles>
<Motorcycles>
<Manufacturer>BMW</Manufacturer>
<PercentageOfRiders>6</PercentageOfRiders>
</Motorcycles>
<Motorcycles>
<Manufacturer>Other</Manufacturer>
<PercentageOfRiders>40</PercentageOfRiders>
</Motorcycles>
</NewDataSet>
Run Code Online (Sandbox Code Playgroud)
带命名空间的XML(不起作用)
<cd:NewDataSet xmlns="urn:ChartData" xmlns:cd="urn:ChartData">
<xs:schema id="NewDataSet"
targetNamespace="urn:ChartData"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
elementFormDefault="qualified">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="cd:Motorcycles" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Motorcycles">
<xs:complexType>
<xs:sequence>
<xs:element name="Manufacturer" type="xs:string" minOccurs="0" />
<xs:element name="PercentageOfRiders" type="xs:int" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<cd:Motorcycles>
<cd:Manufacturer>Honda</cd:Manufacturer>
<cd:PercentageOfRiders>23</cd:PercentageOfRiders>
</cd:Motorcycles>
<cd:Motorcycles>
<cd:Manufacturer>Yamaha</cd:Manufacturer>
<cd:PercentageOfRiders>15</cd:PercentageOfRiders>
</cd:Motorcycles>
<cd:Motorcycles>
<cd:Manufacturer>Suzuki</cd:Manufacturer>
<cd:PercentageOfRiders>16</cd:PercentageOfRiders>
</cd:Motorcycles>
<cd:Motorcycles>
<cd:Manufacturer>BMW</cd:Manufacturer>
<cd:PercentageOfRiders>6</cd:PercentageOfRiders>
</cd:Motorcycles>
<cd:Motorcycles>
<cd:Manufacturer>Other</cd:Manufacturer>
<cd:PercentageOfRiders>40</cd:PercentageOfRiders>
</cd:Motorcycles>
</cd:NewDataSet>
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 10
阅读此XML时,您需要考虑两件事:
urn:ChartData数据集内主数据表的名称 - 您可以在此处找到:
<xs:element name="NewDataSet" msdata:IsDataSet="true"
msdata:MainDataTable="cd:Motorcycles" <== this name here is important
msdata:UseCurrentLocale="true">
Run Code Online (Sandbox Code Playgroud)考虑到这两点,您需要更改实例化的方式DataTable,然后阅读工作正常:
// define the data table's name to be the value of the msdata:MainDataTable
// attribute on the NewDataSet element, and define the XML namespace to use
DataTable dataTable = new DataTable("Motorcycles", "urn:ChartData");
XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString));
dataTable.ReadXml(xmlReader);
Run Code Online (Sandbox Code Playgroud)
现在,您dataTable应该在其.Rows属性中包含一些条目- 在我的情况下为五个(使用您的第二个示例XML).
| 归档时间: |
|
| 查看次数: |
9416 次 |
| 最近记录: |