C#将XML解析为Object并存储到Database中

时间:2017-11-13 09:23:59

标签: c# asp.net sql-server xml entity-framework

我目前正致力于使用SQL Server 2014作为数据存储的ASP.NET MVC 4.6应用程序。

我需要从URL解析XML文档,将XML转换为对象并使用Entity Framework 6将其存储到数据库中。

我需要从这样的URL解析XML:

http://api.myserver.com/notes.xml

我的XML看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<notes>
    <note>
      <to>Tove</to>
      <from>Jane</from>
      <heading>Reminder</heading>
      <body>Don't forget me this weekend!</body>
    </note>
    <note>
      <to>Doe</to>
      <from>John</from>
      <heading>Meeting</heading>
      <body>Hello Monday!</body>
    </note>
<notes>

我的模型课笔记如下:

public class Note
{
    public string To { get; set; }
    public string From { get; set; }
    public string Heading { get; set; }
    public string Body { get; set; }
}

我目前的测试实现看起来像这样,但我对解析XML并不是很满意:

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            String url = "https://www.w3schools.com/xml/note.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(url);
            XmlElement root = doc.DocumentElement;

            StringBuilder sb = new StringBuilder();
            sb.Append("<note>");

            foreach (XmlNode item in root)
            {
                sb.Append(item.OuterXml);
            }
            sb.Append("</note>");

            var result = Deserialize<Note>(sb.ToString());

            // further processing of result using EF 6

            Console.ReadKey();
        }


        public static T Deserialize<T>(string xmlText)
        {
            try
            {
                var stringReader = new StringReader(xmlText);
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(stringReader);
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }

    [XmlRoot(ElementName = "note", Namespace = "")]
    public class Note
    {
        [XmlElement("to")]
        public string To { get; set; }
        [XmlElement("from")]
        public string From { get; set; }
        [XmlElement("heading")]
        public string Heading { get; set; }
        [XmlElement("body")]
        public string Body { get; set; }
    }

}

据我所知,.NET提供了几种解析XML的方法:

  • XmlReader类
  • 的XPath
  • 的XDocument
  • 数据集
  • LINQ

我想知道,您将使用什么以及如何使用.NET解析从URL解析XML文档并将其转换为将其存储在SQL Server数据库中的对象?

感谢您的帮助和考虑!!

2 个答案:

答案 0 :(得分:2)

这可能会对您有所帮助,序列化方法和反序列化方法。

public static string Serialize<T>(T dataToSerialize)
{
    try
    {
        var stringwriter = new ISOEncodingStringWriter();
        var serializer = new XmlSerializer(typeof(T));

        var xns = new XmlSerializerNamespaces();
        xns.Add(string.Empty, string.Empty);

        serializer.Serialize(stringwriter, dataToSerialize, xns);
        return stringwriter.ToString();
    }
    catch
    {
        throw;
    }
}

public static T Deserialize<T>(string xmlText)
{
    try
    {
        var stringReader = new System.IO.StringReader(xmlText);
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(stringReader);
    }
    catch
    {
        throw;
    }
}

您可以使用以下方法:

 Note result = Deserialize<Note>(xmlstring);

 Note note = new Note(){...};
 string convertedToXML = Serialize<Note>(note);

请记住,您需要在注释类中添加一些数据,以便它可以实际序列化数据:

[XmlRoot(ElementName = "root", Namespace = "")]
public class Note
{
    [XmlElementAttribute("To")]
    public string To { get; set; }

    [XmlElementAttribute("From")]
    public string From { get; set; }

    [XmlElementAttribute("Heading")]
    public string Heading { get; set; }

    [XmlElementAttribute("Body")]
    public string Body { get; set; }
}

我希望它有所帮助:)

答案 1 :(得分:1)

您可以使用LINQ to XML遍历文档的节点,使用EF或ADO.NET将它们存储在数据库中。 您可以从这个有用的教程开始:http://www.c-sharpcorner.com/UploadFile/de41d6/learning-linq-made-easy-tutorial-1/