c#读取DataSet子表

时间:2012-02-29 17:54:11

标签: c# xml asp.net-2.0

  <products>
    <product id="1">
          <photos>
            <photo addr="1.jpg" />
          </photos>
          <parameters>
            <parameter name="name" />
          </parameters>
    </product>
  </products>

您好,我有这个xml,我想获取值,比如照片地址或参数名称我不能。  在DataGrid我变得像新表。如何按产品ID读取此参数?

        foreach (DataTable t in dataSet.Tables)
        {
            Console.WriteLine(t);
        }

我得到:产品,照片,照片,参数,参数。

抱歉我的英文

2 个答案:

答案 0 :(得分:0)

默认情况下,DataSet假定基于元素而非属性的模式。您需要为数据构建一个xsd,以使DataSet正确读取该XML。

由于构建此XML的方式,没有简单的方法可以直接将其读入DataSet。您必须使用xsd.exe生成xsd文件,然后使用msdata命名空间中的相应属性手动编辑它。这是一个非常痛苦的过程。

您可以通过使用LINQ重写XML或应用XslCompiledTransform来将文档转换为可能正确解析为DataSet的表单:

<products>
     <product id="1">
         <photo addr="1.jpg" />
         <parameter name="name" />
     </product>
</products>

您还可以考虑在其上使用LINQ to XML,而不是尝试使用DataSet:

var productsInfo = from product in productsElement.Descendants("product")
                   from photo in product.Descendants("photo")
                   from parameter in product.Descendants("parameter")
                   let id = product.Attribute("id")
                   let addr = photo.Attribute("addr")
                   let name = parameter.Attribute("name")
                   select new { ID = id.Value, Addr = addr.Value, Name = name.Value};

如果您正在开发新的XML布局而不是使用现有布局,则可以首先使用设计器创建DataSet。使用一些虚拟数据填充它,然后您可以使用WriteXml来获取xsd架构和示例数据。要保留XML输出中的关系,请确保将Relations上的Nested属性设置为true(请参阅Nesting DataRelations (ADO.NET))。

答案 1 :(得分:0)

好的,您需要使用模式推理生成XSD文件,然后运行xsd.exe以生成您正在寻找的DataSet。

首先,您提供的XML不会起作用,因为您没有根节点。我在这里做了一个疯狂的猜测,但如果<products>是根节点,我们可以重新格式化您的XML,如下所示:

<products>
  <product id="1">
    <photos>
      <photo addr="1.jpg" />
    </photos>
    <parameters>
      <parameter name="name1" />
    </parameters>
  </product>
  <product id="2">
    <photos>
      <photo addr="2.jpg" />
    </photos>
    <parameters>
      <parameter name="name2" />
    </parameters>
  </product>
</products>

然后我们可以使用此XML并通过XmlSchemaInference类从中推断出XSD。当我从上面的XML中推断出模式时,我得到了这个:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="products">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="product">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="photos">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="photo">
                      <xs:complexType>
                        <xs:attribute name="addr" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="parameters">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="parameter">
                      <xs:complexType>
                        <xs:attribute name="name" type="xs:string" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:unsignedByte" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

然后我使用/ dataset选项运行xsd.exe,这给了我一个代表原始XML的功能齐全的DataSet。填充数据集并使用DataSet.GetXml()返回预期的XML结果。

最后说明:我并不主张在域名对象等方面使用DataSet。我只是想告诉你实现既定目标的步骤是什么。