我正在寻找一种将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有一个参数数组,所以我更喜欢从这个而不是数据集生成文件。
答案 0 :(得分:1)
看起来你正在添加节点而不是一个带有属性的节点。
尝试添加一个名为Properties的节点,然后将该节点上的属性设置为您想要的键/值。
答案 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>
如果由于某种原因,您想要取消标准xsi
和xsd
命名空间,您可以执行以下操作:
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;
}