我有一个示例 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但我的案例仍然没有成功。
我解决了:
public class IgnoreNamespaceXmlTextReader(TextReader reader) : XmlTextReader(reader)
{
public override string NamespaceURI => "";
}
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);