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;