生成XML文件并将其读回

时间:2015-03-24 16:35:58

标签: c# xml serialization xml-parsing xml-deserialization

我正在寻找一种将XML写入配置文件并能够将其读回应用程序的良好清洁方式。

我有一个属性数组,每个属性都包含一个字段列表。

例如相机属性列表。

每个属性都有 名称,价值,类别,类型,描述。

我希望我的XML Config看起来像这样

<Camera_Properties>
    <Property Name="Height" Value="40" Category="Dimensions" Type="Int" Description="The height of the box">
    <Property Name="Width" Value="40" Category="Dimensions" Type="Int" Description="The width of the box">
</Camera_Properties>

首先这是可能的还是实用的?

我似乎无法找到一种写这种方式的方法,并且更加无能为力地解析它可以将它拆开以便我可以读取Config文件并且每个元素都被找到这样的调用代码

SetProperty(xmlelement.name,xmlelement.Value,xmlelement.Type);

到目前为止,我已设法获得此输出

<Camera_Properties>
    <Property>
        <Name> Height</Name>
        <Value> 100 </Value>
        <Category> Dimensions </Category>
        <Type> Int </Type>
        <Description> Height of the box </Description>
    </Property>
 </Camera_Properties>

但这对于我需要如何使用配置文件是不切实际的。

我已经使用System.Xml.XmlDocument来实现这一目标。如果有更好的选择,我会很感激的建议。

但由于有数百个属性,这太乱了,难以阅读。

如果有人可以提供帮助或知道哪里可能有相关的例子,我可以作为指导,这将有很大帮助。

由于

修改

我想循环并生成一个包含数组中这些属性的XML文件。我们的想法是,每次硬件关闭时,此文件都可用于加载属性并将属性设置为更改。

public void CreateXML()
{
   // Setup document and header tags

    foreach(Property prop in propertyArray)
    {
       create single element here with prop.Name, Prop.Age etc as attributes
    }

    SaveXml(Filename);
}

我用于硬件的SDK有一个参数数组,所以我更喜欢从这个而不是数据集生成文件。

3 个答案:

答案 0 :(得分:1)

看起来你正在添加节点而不是一个带有属性的节点。

尝试添加一个名为Properties的节点,然后将该节点上的属性设置为您想要的键/值。

以下是一个例子: Microsoft XML Attributes Documentation

答案 1 :(得分:1)

我在工作中使用序列化做了很多工作。

<强> XmlSerializer的

您可以创建一些类来存储信息。写入对象属性,然后使用以下命令对其进行序列化:

XmlSerializer xsSubmit = new XmlSerializer(typeof(Claim));

            var subReq = Claim;
            using (StringWriter sww = new Utf8StringWriter())
            {
                XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
                {
                    Indent = true,
                    OmitXmlDeclaration = false,
                    Encoding = Encoding.Unicode
                };

                using (XmlWriter writer = XmlWriter.Create(sww, xmlWriterSettings))
                {
                    xsSubmit.Serialize(writer, subReq);
                    var xml = sww.ToString();
                    PrintOutput(xml);


                    File.WriteAllText("out.xml", text);

                    Console.WriteLine(xml);
                }
            }

这是我的工作范例。请注意第一行我typeof(Claim)声明是我的父对象,其中包含我的子对象。

将嵌套在另一个对象中的每个对象想象为XML的每个嵌套:

 public class Claim
    {
        public Accident Accident { get; set; }

        public Driver Driver { get; set; }

        public Insurer Insurer { get; set; }

        public Owner Owner { get; set; }

        public Policy Policy { get; set; }

        public Solicitor Solicitor { get; set; }

        public Source Source { get; set; }

}

您可以在上周查看我的问题:XMLSerialization Nesting

数据集序列化

DataSet ds = new Dataset();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
System.IO.StringWriter writer = new System.IO.StringWriter();
Case.WriteXml(writer, XmlWriteMode.WriteSchema);

如果您对使用属性{... 3}}

坚持不懈,请参阅此处

编辑:您可以使用这两种方法重读它们。您可以使用XMLSerializer将数据读回到对象中,也可以反序列化数据集。

答案 2 :(得分:1)

您可以使用XmlSerializer自动序列化和反序列化您的属性集合。如果这样做,则必须使用[XmlAttribute]属性标记属性,以通知序列化程序将它们序列化为XML属性。

例如,给定类:

public class Property
{
    [XmlAttribute]
    public string Name { get; set; }
    [XmlAttribute]
    public string Value { get; set; }
    [XmlAttribute]
    public string Category { get; set; }
    [XmlAttribute]
    public string Type { get; set; }
    [XmlAttribute]
    public string Description { get; set; }
}

[XmlRoot("Camera_Properties")]
public class CameraPropertyList
{
    [XmlElement("Property")]
    public List<Property> Properties { get; set; }
}

您可以按如下方式测试阅读和写作:

        string xml = @"<Camera_Properties>
            <Property Name=""Height"" Value=""40"" Category=""Dimensions"" Type=""Int"" Description=""The height of the box""/>
            <Property Name=""Width"" Value=""40"" Category=""Dimensions"" Type=""Int"" Description=""The width of the box""/>
        </Camera_Properties>
        ";
        CameraPropertyList properties;
        using (StringReader reader = new StringReader(xml))
        {
            properties = (CameraPropertyList)(new XmlSerializer(typeof(CameraPropertyList))).Deserialize(reader);
        }

        string xmlOut;
        using (var textWriter = new StringWriter())
        {
            var settings = new XmlWriterSettings() { Indent = true, IndentChars = "    " }; // For cosmetic purposes.
            using (var xmlWriter = XmlWriter.Create(textWriter, settings))
                (new XmlSerializer(typeof(CameraPropertyList))).Serialize(xmlWriter, properties);
            xmlOut = textWriter.ToString();
        }

        Debug.WriteLine(xmlOut);

生成的XML输出如下所示:

<Camera_Properties xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Property Name="Height" Value="40" Category="Dimensions" Type="Int" Description="The height of the box" />
    <Property Name="Width" Value="40" Category="Dimensions" Type="Int" Description="The width of the box" />
</Camera_Properties>

如果由于某种原因,您想要取消标准xsixsd命名空间,您可以执行以下操作:

        using (var textWriter = new StringWriter())
        {
            var settings = new XmlWriterSettings() { Indent = true, IndentChars = "    " }; // For cosmetic purposes.
            var ns = new XmlSerializerNamespaces();
            ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines.
            using (var xmlWriter = XmlWriter.Create(textWriter, settings))
                (new XmlSerializer(typeof(CameraPropertyList))).Serialize(xmlWriter, properties, ns);
            xmlOut = textWriter.ToString();
        }

或者,如果您希望通过创建XmlDocument手动执行此操作,则可以执行以下操作:

    XmlDocument ToXmlDocument(CameraPropertyList list)
    {
        var doc = new XmlDocument();
        var rootNode = doc.CreateElement("Camera_Properties");
        doc.AppendChild(rootNode);

        foreach (var property in list.Properties)
        {
            var element = doc.CreateElement("Property");
            element.SetAttribute("Name", property.Name);
            element.SetAttribute("Value", property.Value);
            element.SetAttribute("Category", property.Category);
            element.SetAttribute("Type", property.Type);
            element.SetAttribute("Description", property.Description);
            rootNode.AppendChild(element);
        }

        return doc;
    }