将XML数据读入C#应用程序

时间:2012-08-03 13:29:46

标签: c# xml xml-serialization

我需要创建一个看起来像这样的xml文件。

<Event id="Date - Event Name - Event Type">      
    <DogNumber id="dog id number">           
        <dogName id-"dog id number">dog name</dogName>               
        <dogBreed>dog breed</dogBreed>      
    </DogNumber>
</Event>

然后它会再次重复另一个事件,除了元素的不同值和属性。

<Event id="Date - Event Name - Event Type">      
    <DogNumber id="dog id number">           
        <dogName id-"dog id number">dog name</dogName>               
        <dogBreed>dog breed</dogBreed>      
    </DogNumber>
</Event>

我不熟悉使用C#创建XML文件,并且无法正确地将元素添加到元素并使父节点和子节点与上面显示的相同。我需要能够从我的C#应用​​程序中查看此文件,并能够根据特定事件读取上面列出的所有值,然后在每个事件中读取特定的狗。选择哪个事件和哪个狗的标准可能基于ComboBox中的用户输入。我的计划是使用getElementById方法。但是,我已经看到了很多不同的方法,我无法确定最好和最有效的方法。

5 个答案:

答案 0 :(得分:4)

我认为读取/写入xml文件的最简单方法是使用XMLSerializer。此方法还使您可以轻松绑定到数据(如果您使用WPF for UI)

创建可序列化的类:

    public class Event
    {
        [XmlAttribute]
        public string id { get; set; }

        [XmlElement]
        public DogNumber DogNumber { get; set; }
    }

    public class DogNumber
    {
        [XmlAttribute]
        public string id { get; set; }

        [XmlElement]
        public dogName dogName { get; set; }

        [XmlElement]
        public string dogBreed { get; set; }
    }

    public class dogName
    {
        [XmlAttribute]
        public string id { get; set; }

        [XmlTextAttribute]
        public string value { get; set;  }
    }

然后使用XmlSerializer反序列化(使用文件示例):

        Stream input = File.OpenRead("C:\\test.xml");
        XmlSerializer serialier = new XmlSerializer(typeof(Event));
        Event newevent = serialier.Deserialize(input) as Event;
        input.Close();

答案 1 :(得分:2)

检查LINQ to XML。

Here is a very quick overview

msdn

答案 2 :(得分:0)

我发现XML的最佳方法是使用类来序列化/反序列化。

例如,请使用以下代码:

/// <summary>
/// Details on the destination of the shipment.
/// </summary>
[XmlRoot("destination")]
public class Destination
{
    List<Recipient> recipient { get; set; }
}

/// <summary>
/// Recipient details.
/// </summary>
[XmlRoot("recipient")]
public class Recipient
{

    /// <summary>
    /// Client Id of the recipient; only used if selected as the sort criterion.
    /// </summary>
    /// <remarks>Truncated after 30 characters.</remarks>        
    [XmlElement("client-id")]
    public string ClientID { get; set; } 

    /// <summary>
    /// Name of the individual receiving the shipment.
    /// </summary>
    /// <remarks>Truncated after 44 characters.</remarks>
    [XmlElement("contact-name")]
    public string ContactName { get; set; } 

    /// <summary>
    /// Name of the company.
    /// </summary>
    /// <remarks>Truncated after 44 characters.</remarks>
    [XmlElement("company")]
    public string Company { get; set; }

    ...

这将允许我将对象序列化为如下所示的XML:

<destination>
     <recipient>
         <client-id></client-id>
         <contact-name></contact-name>
         <company></company>
         ...

我可以通过使用XmlRoot或XmlElement修饰符来控制XML的创建方式。在您的情况下,您可以使用[XmlAttribute("attributeName")]指定属性。

您可以在此处详细了解各种XML修饰符:http://msdn.microsoft.com/en-us/library/e123c76w

答案 3 :(得分:0)

在C#中创建或读取XML,你想使用XDocument class(你在这个msdn网站的末尾有使用样本)

XDocument yourXml = null;

处理完毕后(添加节点等)如果需要,可以将xml保存在file.xml中

// verify if file not existing
if (!System.IO.File.Exists(@"yourName.xml"))
{
    // if file not exist, create xml file.
    FileStream fs = File.Create(@"yourName.xml");
    fs.Close();
}

// save your xml in xml file
yourXml.Save(@"yourName.xml");

答案 4 :(得分:0)

您可以尝试使用XDocument,如:

XDocument doc = new XDocument(new XElement("Event", new XAttribute("Id", youEventString),
    new XElement("DogNumber", new XAttribute("id", dogId),
    new XElement("dogName", new XAttribute("id", dogNumber), dogNname),
    new XElement("dogBreed", dogBreed)  
    )));
doc.Save(filename);

你可以用适当的字符串替换youEventString,dogId,dogNumber,dogName,dogBreed。还提供要保存文件的文件名。

祝你好运