<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);
}
我得到:产品,照片,照片,参数,参数。
抱歉我的英文
答案 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。我只是想告诉你实现既定目标的步骤是什么。