如何在单个展平对象中读取嵌套XML

时间:2018-05-15 06:37:38

标签: c# xml

我必须读取嵌套的xml并保存到db但是问题是xml是嵌套的,当我用dataset.readxml()方法读取它时必须保存在单个表中它返回多个表但我需要单个表是否存在任何方式这样做?我想要像

这样的结果

作者|联系|书|价

测试| 155335852 | abc | 152

测试| 155335852 | xyz | 1523

<bookinfo>
<author>
<name>test</name>
<contact>155335852</contact>
</author>
<books>
<book>
<title>abc</book>
<price>152</price>
</book>
<book>
<title>xyz</book>
<price>1523</price>
</book>
</books>
</bookinfo>

2 个答案:

答案 0 :(得分:0)

使用xml Linq。当xml文件包含大量嵌套标记时,DataSet / DataTable ReadXml()方法无法正常工作。结果是一个碎片化的数据集,不能组合成任何有用的东西。所以你必须手动解析xml。见下面的代码。 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication44
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Author", typeof(string));
            dt.Columns.Add("Contact", typeof(string));
            dt.Columns.Add("Book", typeof(string));
            dt.Columns.Add("Price", typeof(decimal));

            XDocument doc = XDocument.Load(FILENAME);
            foreach(XElement bookInfo in doc.Descendants("bookinfo"))
            {
                string author = (string)bookInfo.Descendants("name").FirstOrDefault();
                string contact = (string)bookInfo.Descendants("contact").FirstOrDefault();

                foreach (XElement book in bookInfo.Descendants("book"))
                {
                    string title = (string)book.Element("title");
                    decimal  price = (decimal)book.Element("price");

                    dt.Rows.Add(new object[] { author, contact, title, price });
                }
            }

        }
    }
}

答案 1 :(得分:0)

在表格结构中存储分层数据的一些可能方法是:

(a)blob或clobs。只需在表中使用带有微语法的大型二进制或字符字段来表示层次结构。微语法甚至可以是XML。缺点:您必须解析每次访问的数据;查询变得困难

(a)切碎。将数据简化为最原始的形式,并使用一种众所周知的技术来表示层次数据的表格:请参阅What are the options for storing hierarchical data in a relational database?下行:以可用形式汇编数据通常需要访问数十或数百行,并且复杂的多-way加入。

通过拆卸所有零件,将每个零件存放在正确的货架位置,然后在早上开车前重新组装,可以将车停在车库过夜。这不是很有趣。这就是为什么XML数据库是如此有吸引力的选择。