如何检查未知的XML文件以获取其元素或属性?

时间:2019-07-19 14:45:04

标签: c# xml xmlserializer xmldocument xmlreader

我有一个应用程序,用户可以为我上传一个未知的XML文件,在其中读取内容(我使用每个Element和Attribute名称),他可以选择哪个Attribute或Element引用每个对象属性。因此,用户配置如何使用我们的对象序列化XML。然后我保存了映射。

因此,问题是将这个XML文件转换为我的Object的最佳实践。请记住,XML可能包含未知的Attribute或Element值。

例如:

<Students>
  <Student>
    <Id>474</Id>
    <Name>Test</Name>
  </Student>
</Students>

对象:

public clas Student{
  public string cod{ get; set; }
  public string name{ get; set; }
}

我附上一张有关用户如何定义XML元素或属性与我们的模型类之间的相关性的图像:

enter image description here

1 个答案:

答案 0 :(得分:1)

在使用XmlSerializer的情况下,可以使用XmlAttributeOverrides进行映射。

string codMapping = "Id"; // get from user
string nameMapping = "Name"; // get from user


var overrides = new XmlAttributeOverrides();

var attrCod = new XmlAttributes();
var attrName = new XmlAttributes();

attrCod.XmlElements.Add(new XmlElementAttribute(codMapping));            
attrName.XmlElements.Add(new XmlElementAttribute(nameMapping));

overrides.Add(typeof(Student), nameof(Student.cod), attrCod);
overrides.Add(typeof(Student), nameof(Student.name), attrName);


var xs = new XmlSerializer(
    typeof(List<Student>), overrides, null, new XmlRootAttribute("Students"), null);
List<Student> students;

using (var fs = new FileStream("test.xml", FileMode.Open))
{
    students = (List<Student>)xs.Deserialize(fs);
}

foreach (var s in students)
    Console.WriteLine(s.cod + " " + s.name);