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

Posted

技术标签:

【中文标题】如何检查未知的 XML 文件以获取其元素或属性?【英文标题】:How do I inspect an unknown XML file to get its elements or attributes? 【发布时间】:2019-11-28 14:07:06 【问题描述】:

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

所以问题是将这个 XML 文件转换为我的对象的最佳实践。请记住,XML 可能包含未知的属性或元素值。

例如:

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

还有对象:

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

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

【问题讨论】:

这是概念性的还是你开始写代码了?您的用户会定义 XML 元素和模型类之间的关联吗?您可以使用 XmlTextReader 之类的东西来“遍历”XML 结构并检查其元素和属性。 还有一件事,“序列化/反序列化”是指当您采用已知类型时,您可以将其从内存中的对象转换为文本,然后再转换回内存中的对象。它主要用于存储和传输应用程序状态。我认为您的标题应该类似于“如何检查未知 XML 文件以获取其元素” 更多信息:***.com/questions/10150785/using-xmltextreader 谢谢你的回答,我已经开始写代码了。是的,用户定义了相关性。我会检查XmlTextReader。我需要将任何 XML 转换为我的对象类。但问题是有时 XML 可以包含 Element 或 Attribute 值.. 【参考方案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);

【讨论】:

太棒了!它可以是解决方案..但我有一个问题,是否可以为会员执行解决方案?像映射解析器..

以上是关于如何检查未知的 XML 文件以获取其元素或属性?的主要内容,如果未能解决你的问题,请参考以下文章

xml:从iterparse元素获取父属性

如何通过Elasticsearch 6.x中的动态或未知字段进行聚合

如何检索元素父容器的属性

如何检查字符串是不是是有效的 XML 元素名称?

XAML对象元素语法

如何在解析后获取xml文件的元素并在iPhone程序中对其进行验证