当我将xml文件读入数据集时,如果根节点具有多个子标记,则它不会为根节点创建表。为什么是这样?有没有办法让它在不修改xml的情况下生成根表?
static void Main(string[] args) {
var ds =Load(@"<root>
<Stores>Lambton Quay</Stores>
<Stores>Willis Street</Stores>
</root>");
var ds2 = Load(@"<root>
<t>1</t>
<Stores>Lambton Quay</Stores>
<Stores>Willis Street</Stores>
</root>");
Console.WriteLine("ds table count: {0}", ds.Tables.Count); //1 <- expecting 2
Console.WriteLine("ds2 table count: {0}", ds2.Tables.Count); //2
Console.ReadKey();
}
static DataSet Load(string xml) {
var xd = new XmlDocument();
xd.LoadXml(xml);
var ds = new DataSet();
ds.ReadXml(new XmlNodeReader(xd));
return ds;
}
要清楚,我想知道为什么DataSet ds在ds2没有root
表时会这样做。
有人做出了决定:
#3的原因是什么?
答案 0 :(得分:-1)
第一个XML示例不会在数据集中创建“根”表,因为在具有该名称的表中不会创建任何行或列。
在第二个示例中,尝试添加第二个<t>
元素。您仍将获得两个表,但它们将被命名为“t”和“Stores”(而不是“root”和“Stores”)。另一个测试是在第二个例子中添加另一个不同的元素(比如<r>1</r>
)。在这种情况下,您仍然会有两个表“root”和“Stores”,但现在“root”表将有1行,包含2列(列“r”和列“t”)。
当解析器看到两个具有相同名称的元素时,它将为该元素创建一个表,并且该元素的每个实例都将是表中的新行。当解析器在节点下看到多个单个元素时,它将使用父节点的名称作为表名创建一个表,父节点下的每个单元素将是表中的一列。