Есть еще один способ решить эту проблему. Преобразуйте этот XML в формат, который хочет DataSet
, а затем загрузите его, используя DataSet.ReadXml
. Это что-то вроде боли, если вы не знаете XSLT. Но действительно важно знать XSLT, если вы работаете с XML.
XSLT, который вам нужен, довольно прост. Начните с преобразования XSLT . Затем добавьте шаблон, который преобразует элементы Response
и Item
в формат, ожидаемый DataSet
:
<xsl:template match="Response">
<MyDataSetName>
<xsl:apply-templates select="Item"/>
</MyDataSetName>
</xsl:template>
<xsl:template match="Item">
<MyDataTableName>
<xsl:apply-templates select="Field[@Name='ID' or @Name='Name' or @Name='Path']"/>
</MyDataTableName>
</xsl:template>
<xsl:template match="Field">
<xsl:element name="{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
Это изменит ваш XML на документ, который выглядит следующим образом:
<MyDataSetName>
<MyDataTableName>
<ID>767147519</ID>
<Name>Music</Name>
<Path>Family\Music</Path>
</MyDataTableName>
</MyDataSetName>
... и вы можете просто передать это DataSet.ReadXml
.
Edit:
Я должен отметить, что, если вы не сделаете этого много, не очевидно, что одним из эффектов этого является то, что количество кода C #, которое вам нужно создать и заполнить DataSet
, минимально:
private DataSet GetDataSet(string inputFilename, string transformFilename)
{
StringBuilder sb = new StringBuilder();
using (XmlReader xr = XmlReader.Create(inputFilename))
using (XmlWriter xw = XmlWriter.Create(new StringWriter(sb)))
{
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(transformFilename);
xslt.Transform(xr, xw);
}
using (StringReader sr = new StringReader(sb.ToString()))
{
DataSet ds = new DataSet();
ds.ReadXml(sr);
return ds;
}
}
Это также многоразовое использование. Вы можете использовать этот метод, чтобы заполнить столько разных DataSet
s, сколько вам нужно; вам просто нужно написать преобразование для каждого формата.