XML 解析 - 解析 2 个相同名称的 XML 数组

XML Parsing - Parsing 2 identical named XMLArrays

我实际上已经搜索了周围,但没有找到满足我要求的解决方案。我要做的是将.csproj文件的一些信息解析成c#对象。

我正在使用此功能来执行此操作。该方法提供了解析任何 xmlFile 的可能性,只要我将文件表示为 c# 对象即可进行转换。

public static Object  DeserializeXml(string xmlPath)
    {    
        if (File.Exists(xmlPath))
        {
            object returnObject;
            XmlSerializer serializer = new XmlSerializer(typeof (ProjectConfiguration));

            using (FileStream fs = new FileStream(xmlPath, FileMode.Open))
            {
                XmlReader reader = XmlReader.Create(fs);
                returnObject = serializer.Deserialize(reader);
                fs.Close();
            }
            return returnObject;
        }
        return null;
    }

问题来了。 csproj 文件显示类似的 XmlArrays。

<ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
</ItemGroup>  
<ItemGroup>
   <Compile Include="Class1.cs" />
   <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>enter code here

有人知道如何在 c# class 文件中对其进行注释吗? 这会引发错误...

    [XmlArray("ItemGroup")]
    [XmlArrayItem("Compile")]
    [XmlAttribute("Include")]
    public List<string> ItemGroupCompileIncludeSurrogate
    {
        get   {...}

        set   {...}
    }
    [XmlArray("ItemGroup")]
    [XmlArrayItem("Reference ")]
    [XmlAttribute("Include")]
    public List<string> ItemGroupCompileIncludeSurrogate
    {
        get   {...}

        set   {...}
    }

谢谢大家的预测! ;-)

[编辑] 使用第一个想法后 -> 谢谢 :-) 它看起来像这样

<ItemGroup>
   <Reference Include="System" />
   <Reference Include="System.Core" />
   <Compile Include="Class1.cs" />
   <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

Greez Iki

尝试:

public class Root
{
    [XmlElement("ItemGroup")]
    public List<ItemGroup> ItemGroups { get; set; }
}

public class ItemGroup
{
    [XmlElement("Reference")]
    public List<ReferenceOrCompile> References { get; set; }

    [XmlElement("Compile")]
    public List<ReferenceOrCompile> Compiles { get; set; }
}

public class ReferenceOrCompile
{
    [XmlAttribute("Include")]
    public string Include { get; set; }
}

如果要将对象转换为 xml,请使用:

var item1 = new ReferenceOrCompile() { Include = "System" };
var item2 = new ReferenceOrCompile() { Include = "System.Core" };
var item3 = new ReferenceOrCompile() { Include = "Class1.cs" };
var item4 = new ReferenceOrCompile() { Include = "Properties\AssemblyInfo.cs" };

var group1 = new ItemGroup()
{
    References = new List<ReferenceOrCompile>()
    {
        item1, item2
    }
};
var group2 = new ItemGroup()
{
    Compiles = new List<ReferenceOrCompile>()
    {
        item3, item4
    }
};

var root = new Root()
{
    ItemGroups = new List<ItemGroup>()
    {
        group1, group2
    }
}

然后序列化(root)

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml"; 
        static void Main(string[] args)
        {

            Root root = new Root()
            {
                itemGroup = new List<ItemGroup>() {
                     new ItemGroup(){
                         reference = new List<Reference>() {
                             new Reference(){ include = "System"},
                             new Reference(){ include= "System.Core"}
                         }
                     },
                     new ItemGroup(){
                         compile = new List<Compile>(){
                             new Compile() { include = "Class1.cs"},
                             new Compile() { include = "Properties\AssemblyInfo.cs"}
                         }
                     }
                }
            };

            XmlSerializer serializer = new XmlSerializer(typeof(Root));

            StreamWriter writer = new StreamWriter(FILENAME);
            serializer.Serialize(writer, root);
            writer.Flush();
            writer.Close();
            writer.Dispose();

            XmlSerializer xs = new XmlSerializer(typeof(Root));
            XmlTextReader reader = new XmlTextReader(FILENAME);
            Root newRoot = (Root)xs.Deserialize(reader);



        }
    }
    [XmlRoot("Root")]
    public class Root
    {
        [XmlElement("ItemGroup")]
        public List<ItemGroup> itemGroup { get; set; }
    }
    [XmlRoot("ItemGroup")]
    public class ItemGroup
    {
        [XmlElement("Compile")]
        public List<Compile> compile { get; set; }
        [XmlElement("Reference")]
        public List<Reference> reference { get; set; }
    }
    [XmlRoot("Compile")]
    public class Compile
    {
        [XmlAttribute("Include")]
        public string include { get; set; }
    }
    [XmlRoot("Reference")]
    public class Reference
    {
        [XmlAttribute("Include")]
        public string include { get; set; }
    }

}
​