【问题标题】:Trying to deserialize a netcore csproj from XML to Object尝试将 netcore csproj 从 XML 反序列化为 Object
【发布时间】:2019-09-18 10:33:31
【问题描述】:

我正在尝试将 xml 文档反序列化为 poco 类,显然,csproj 文件不是最严格的 XML 文件(缺少 xml 标头),但它们通过了所有验证检查。

我得到的错误是<Project xmlns=''> was not expected.,反序列化的代码如下。

我是否错过了一些显而易见的事情?

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; }
}

【问题讨论】:

  • 如果 xml 没有属性值,则该 xml 无效。应该是这样的:xmlns:p=''"
  • 好的 - 在这种情况下它是无效的 - 任何建议如何解析它?
  • 你必须在解析之前修复 XML。
  • 这不是我的 XML,而是 CSPROJ 文件的 XML。
  • 这是错误的。不知道它是如何创建的。然后修复它。该项目显然忽略了错误。

标签: c# xml serialization deserialization


【解决方案1】:

您似乎需要使用 XmlRootAttribute 来指定您的根元素。 而不是 ... new XmlSerializer(typeof(T), root)

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

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2011-05-14
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多