C# XML 根节点有时具有命名空间属性的反序列化
C# XML Deserialization where root node sometimes has namespace attribute
我正在尝试从 XML 文档中读取 PackageReferences。
我的 xml 文件如下所示:
<Project>
<ItemGroup>
<PackageReference Update="PackageName" Version="PackageVersion" />
</ItemGroup>
</Project>
和
<Project xmlns="http://url/">
<ItemGroup>
<PackageReference Update="PackageName" Version="PackageVersion" />
</ItemGroup>
</Project>
这是我的反序列化代码:
var xmlResolver = new XmlSecureResolver(new XmlUrlResolver(), new System.Security.PermissionSet(System.Security.Permissions.PermissionState.None));
using (var sr = new StringReader(this.FileSystem.File.ReadAllText(path)))
{
var xmlReaderSettings = new XmlReaderSettings { XmlResolver = xmlResolver };
return (Project)new XmlSerializer(typeof(Project)).Deserialize(XmlReader.Create(sr, xmlReaderSettings));
}
这是项目部分 class:
{
using System;
using System.Xml.Serialization;
[Serializable]
public partial class Project
{
private ProjectItemGroup[] itemGroupField;
[XmlElement("ItemGroup")]
public ProjectItemGroup[] ItemGroup
{
//...
}
}
[Serializable]
public partial class ProjectItemGroup
{
private Package[] packageReferenceField;
[XmlElement("PackageReference")]
public Package[] PackageReference
{
get
{
return this.packageReferenceField;
}
set
{
this.packageReferenceField = value;
}
}
}
}
我的反序列化代码可以毫无问题地读取第一个 xml 文件,但在 xmlns="https://url/"
.
的第二个文件上崩溃
错误:
System.InvalidOperationException: There is an error in XML document (2, 2). ---> System.InvalidOperationException: <Project xmlns='http://url/'> was not expected.
如何修改此程序以安全地忽略(或以某种方式处理)xml 命名空间?
您可以使用 NamespaceIgnorantXmlTextReader
public class NamespaceIgnorantXmlTextReader : XmlTextReader
{
public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader) : base(reader) { }
public override string NamespaceURI
{
get { return ""; }
}
}
var ser = new XmlSerializer(typeof(Project));
using var sr = new StringReader(xml);
using var textReader = new NamespaceIgnorantXmlTextReader(sr);
var proj = ser.Deserialize(textReader);
你也可以在调用Deserialize
之前设置textReader.Namespaces = false;
我正在尝试从 XML 文档中读取 PackageReferences。
我的 xml 文件如下所示:
<Project>
<ItemGroup>
<PackageReference Update="PackageName" Version="PackageVersion" />
</ItemGroup>
</Project>
和
<Project xmlns="http://url/">
<ItemGroup>
<PackageReference Update="PackageName" Version="PackageVersion" />
</ItemGroup>
</Project>
这是我的反序列化代码:
var xmlResolver = new XmlSecureResolver(new XmlUrlResolver(), new System.Security.PermissionSet(System.Security.Permissions.PermissionState.None));
using (var sr = new StringReader(this.FileSystem.File.ReadAllText(path)))
{
var xmlReaderSettings = new XmlReaderSettings { XmlResolver = xmlResolver };
return (Project)new XmlSerializer(typeof(Project)).Deserialize(XmlReader.Create(sr, xmlReaderSettings));
}
这是项目部分 class:
{
using System;
using System.Xml.Serialization;
[Serializable]
public partial class Project
{
private ProjectItemGroup[] itemGroupField;
[XmlElement("ItemGroup")]
public ProjectItemGroup[] ItemGroup
{
//...
}
}
[Serializable]
public partial class ProjectItemGroup
{
private Package[] packageReferenceField;
[XmlElement("PackageReference")]
public Package[] PackageReference
{
get
{
return this.packageReferenceField;
}
set
{
this.packageReferenceField = value;
}
}
}
}
我的反序列化代码可以毫无问题地读取第一个 xml 文件,但在 xmlns="https://url/"
.
错误:
System.InvalidOperationException: There is an error in XML document (2, 2). ---> System.InvalidOperationException: <Project xmlns='http://url/'> was not expected.
如何修改此程序以安全地忽略(或以某种方式处理)xml 命名空间?
您可以使用 NamespaceIgnorantXmlTextReader
public class NamespaceIgnorantXmlTextReader : XmlTextReader
{
public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader) : base(reader) { }
public override string NamespaceURI
{
get { return ""; }
}
}
var ser = new XmlSerializer(typeof(Project));
using var sr = new StringReader(xml);
using var textReader = new NamespaceIgnorantXmlTextReader(sr);
var proj = ser.Deserialize(textReader);
你也可以在调用Deserialize
之前设置textReader.Namespaces = false;