在 C# 中反序列化时 XML 忽略命名空间

问题描述 投票:0回答:1

我有一个示例 xml 结构,例如:

<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE nzb PUBLIC "-//newzBin//DTD NZB 1.0//EN" "http://www.newzbin.com/DTD/nzb/nzb-1.0.dtd">
<nzb xmlns="http://www.newzbin.com/DTD/2003/nzb">
   <file...>
   </file>
   <file...>
   </file>
</nzb>

和 .NET 类:

 [XmlRoot(ElementName = "nzb")]
 [XmlType("nzb")]
 public class Nzb
 {
     [XmlElement(ElementName = "file")]
     public FileData[] Files { get; set; } = [];
 }

 [XmlRoot(ElementName = "file")]
 public class FileData
 {
 }

我尝试过:

XmlSerializer serializer = new XmlSerializer(typeof(Nzb));
Nzb? obj = null;

using TextReader reader = new StringReader(File.ReadAllText(file));
obj = (Nzb)serializer.Deserialize(reader);

没有办法摆脱可能不同的命名空间。我从这里尝试了Error Deserializing Xml to Object - xmlns='' was not returned但我的案例仍然没有成功。

c# xml
1个回答
0
投票

我解决了:

  1. 添加自定义 XmlTextReader:
public class IgnoreNamespaceXmlTextReader(TextReader reader) : XmlTextReader(reader)
{
    public override string NamespaceURI => "";
}
  1. 更改反序列化代码:
string content = File.ReadAllText(file);
// ignore everything before <nzb since I don't care about xml version or stuff
content = content.Substring(content.IndexOf("<nzb"));

using TextReader reader = new StringReader(content);
using IgnoreNamespaceXmlTextReader xmlReader = new(reader);
obj = (Nzb)serializer.Deserialize(xmlReader);
© www.soinside.com 2019 - 2024. All rights reserved.