C# 将 XML 文件从给定标签解析为对象

Posted

技术标签:

【中文标题】C# 将 XML 文件从给定标签解析为对象【英文标题】:C# Parse XML file into object from given tag 【发布时间】:2021-02-16 05:33:38 【问题描述】:

我有一个 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 数据?

【问题讨论】:

恕我直言,您应该使用XmlReader 打开您的 XML 文件,然后遍历所有标签,直到找到您想要的标签。然后您可以使用相同的XmlReader 反序列化您想要的数据,或者只从该节点获取OuterXml 并使用XmlSerializer 反序列化它 使用 XML Reader 然后你可以 readto 方法来获取你需要的标签: System.Xml.XmlReader reader = System.Xml.Create(file); reader.ReadToFollowing(tag);xmlSerializer.Deserialize(reader) 【参考方案1】:

您可以尝试在找到您的节点之前读取 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;

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

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

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

【讨论】:

以上是关于C# 将 XML 文件从给定标签解析为对象的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis面试题

Python3将xml文件解析为Python对象

C# - 将 HTML 源解析为 XML

使用 C# 从 html 中删除自定义 xml 标签

C# 在忽略命名空间的同时反序列化 xml

在 NodeJs 中使用 fast-xml-parser 将特定标签解析为数组