简体   繁体   English

尝试将 netcore csproj 从 XML 反序列化为对象

[英]Trying to deserialize a netcore csproj from XML to Object

I'm trying to deserialise a xml doc into a poco class, obviously, the csproj files aren't the strictest XML files (missing xml header`), but they pass all the validation checks.我正在尝试将 xml 文档反序列化为 poco 类,显然, csproj文件不是最严格的 XML 文件(缺少xml标头),但它们通过了所有验证检查。

The error I'm getting is <Project xmlns=''> was not expected.我得到的错误是<Project xmlns=''> was not expected. , and the code to deserialise is below. ,反序列化的代码如下。

Have I missed something blindingly obvious?我是否错过了一些非常明显的东西?

var csProj = projPath.ParsePathToXML<CsProj2.Models.Project>("Project");

public static T ParsePathToXML<T>(this string @this, string root = "")
    {
        string xml = File.ReadAllText(@this);

        XmlSerializer serializer = new XmlSerializer(typeof(T), root);
        T result;

        using (TextReader reader = new StringReader(xml))
        {
            result = (T)serializer.Deserialize(reader);
        }

        return result;
    }


[XmlRoot(ElementName = "PropertyGroup")]
public class PropertyGroup
{
    [XmlElement(ElementName = "TargetFramework")]
    public string TargetFramework { get; set; }
    [XmlElement(ElementName = "RuntimeIdentifier")]
    public string RuntimeIdentifier { get; set; }
    [XmlElement(ElementName = "RuntimeFrameworkVersion")]
    public string RuntimeFrameworkVersion { get; set; }
    [XmlElement(ElementName = "TargetsForTfmSpecificBuildOutput")]
    public string TargetsForTfmSpecificBuildOutput { get; set; }
    [XmlElement(ElementName = "PreserveCompilationContext")]
    public string PreserveCompilationContext { get; set; }
    [XmlElement(ElementName = "AssemblyName")]
    public string AssemblyName { get; set; }
    [XmlElement(ElementName = "OutputType")]
    public string OutputType { get; set; }
    [XmlElement(ElementName = "PackageId")]
    public string PackageId { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyTitleAttribute")]
    public string GenerateAssemblyTitleAttribute { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyDescriptionAttribute")]
    public string GenerateAssemblyDescriptionAttribute { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyConfigurationAttribute")]
    public string GenerateAssemblyConfigurationAttribute { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyCompanyAttribute")]
    public string GenerateAssemblyCompanyAttribute { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyProductAttribute")]
    public string GenerateAssemblyProductAttribute { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyCopyrightAttribute")]
    public string GenerateAssemblyCopyrightAttribute { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyVersionAttribute")]
    public string GenerateAssemblyVersionAttribute { get; set; }
    [XmlElement(ElementName = "GenerateAssemblyFileVersionAttribute")]
    public string GenerateAssemblyFileVersionAttribute { get; set; }
    [XmlElement(ElementName = "DocumentationFile")]
    public string DocumentationFile { get; set; }
    [XmlElement(ElementName = "Authors")]
    public string Authors { get; set; }
    [XmlElement(ElementName = "PublishWithAspNetCoreTargetManifest")]
    public string PublishWithAspNetCoreTargetManifest { get; set; }
    [XmlElement(ElementName = "VersionPrefix")]
    public string VersionPrefix { get; set; }
    [XmlElement(ElementName = "VersionSuffix")]
    public string VersionSuffix { get; set; }
    [XmlElement(ElementName = "IsPackable")]
    public string IsPackable { get; set; }
}

[XmlRoot(ElementName = "Content")]
public class Content
{
    [XmlElement(ElementName = "CopyToOutputDirectory")]
    public string CopyToOutputDirectory { get; set; }
    [XmlAttribute(AttributeName = "Update")]
    public string Update { get; set; }
}

[XmlRoot(ElementName = "ItemGroup")]
public class ItemGroup
{
    [XmlElement(ElementName = "Content")]
    public List<Content> Content { get; set; }
    [XmlElement(ElementName = "PackageReference")]
    public List<PackageReference> PackageReference { get; set; }
    [XmlElement(ElementName = "ProjectReference")]
    public ProjectReference ProjectReference { get; set; }
    [XmlElement(ElementName = "BuildOutputInPackage")]
    public BuildOutputInPackage BuildOutputInPackage { get; set; }
}

[XmlRoot(ElementName = "PackageReference")]
public class PackageReference
{
    [XmlAttribute(AttributeName = "Include")]
    public string Include { get; set; }
    [XmlAttribute(AttributeName = "Version")]
    public string Version { get; set; }
}

[XmlRoot(ElementName = "ProjectReference")]
public class ProjectReference
{
    [XmlAttribute(AttributeName = "Include")]
    public string Include { get; set; }
    [XmlAttribute(AttributeName = "PrivateAssets")]
    public string PrivateAssets { get; set; }
}

[XmlRoot(ElementName = "BuildOutputInPackage")]
public class BuildOutputInPackage
{
    [XmlAttribute(AttributeName = "Include")]
    public string Include { get; set; }
}

[XmlRoot(ElementName = "Target")]
public class Target
{
    [XmlElement(ElementName = "ItemGroup")]
    public ItemGroup ItemGroup { get; set; }
    [XmlAttribute(AttributeName = "Name")]
    public string Name { get; set; }
    [XmlAttribute(AttributeName = "DependsOnTargets")]
    public string DependsOnTargets { get; set; }
}

[XmlRoot(ElementName = "Project")]
public class Project
{
    [XmlElement(ElementName = "PropertyGroup")]
    public List<PropertyGroup> PropertyGroup { get; set; }
    [XmlElement(ElementName = "ItemGroup")]
    public List<ItemGroup> ItemGroup { get; set; }
    [XmlElement(ElementName = "Target")]
    public Target Target { get; set; }
    [XmlAttribute(AttributeName = "Sdk")]
    public string Sdk { get; set; }
}

It seems you need to specify your root element by using XmlRootAttribute.您似乎需要使用 XmlRootAttribute 来指定根元素。 Instead of ... new XmlSerializer(typeof(T), root)而不是 ... new XmlSerializer(typeof(T), root)

new XmlSerializer(typeof(T), new XmlRootAttribute(root));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM