首页 > 解决方案 > C# 将 XML 文件从给定标签解析为对象

问题描述

我有一个 xml 文件,并且我想制作成一个对象的数据集被另一个标签封装,所以当我尝试解析它时,由于意外成员,它当然会抛出 InvalidOperationException。

我已经尝试阅读有关 xml 的各种 MS Docs,以及在谷歌上搜索我的问题,但是如果没有太多的麻烦,我找不到如何解决它。

我的代码:

public static ClassToDeserialize GetObjectFromXml (string path)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(ClassToDeserialize));
        System.IO.FileStream file = System.IO.File.OpenRead(path);
        ClassToDeserialize loadedObjectXml = xmlSerializer.Deserialize(file) as ClassToDeserialize;
        return loadedLicenseXml;
    }

那么我怎么能告诉这个程序只从一个特定的标签开始反序列化,因为它包含对象的相关 xml 数据呢?

标签: c#xmldeserializationxml-deserialization

解决方案


您可以尝试在找到节点的位置阅读 Xml,然后检索它的外部 xml 并将其放入XmlSerializer. 假设您有一个像这样的简单 XML 文件:

<rootnode>
  <!-- some nodes inside -->
  <uselessNode>
    <thatsWhatIWant>
      <!-- some fields inside -->
      <uselessNodeInside/>
      <usefullNodeInside/>
    </thatsWhatIWant>
  </uselessNode>
</rootnode>

你可以做的是打开XmlReader

XmlReader reader = XmlReader.Create("path/to/myfile.xml");

然后将内容读取到您的 POI 并将其存储在某个变量中:

string wantedNodeContents = string.Empty;
while (reader.Read())
{
    if(reader.NodeType == XmlNodeType.Element && reader.Name == "thatsWhatIWant")
    {
        wantedNodeContents = reader.ReadOuterXml();
        break;
    }
}

有了这个,你应该可以XmlSerializer像这样使用:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(ClassToDeserialize));
System.IO.TextReader textReader = System.IO.StringReader(wantedNodeContents);
ClassToDeserialize loadedObjectXml = xmlSerializer.Deserialize(textReader) as ClassToDeserialize;

您可以选择(或除此之外)尝试为UnknownNodeand添加一些处理程序UnknownAttribute

xmlSerializer.UnknownNode+= new XmlNodeEventHandler(UnknownNode);
xmlSerializer.UnknownAttribute+= new XmlAttributeEventHandler(UnknownAttribute);

void UnknownNode(object sender, XmlNodeEventArgs e) { }
void UnknownAttribute(object sender, XmlAttributeEventArgs e) { }

推荐阅读