如何使用XDocument类从下面的类中获取XML

本文关键字:获取 XML 何使用 XDocument | 更新日期: 2023-09-27 18:17:06

我有两个类

class WarningClass
{
        public string SqlEyeWarning { get; set; }
        public string FileName { get; set; }
}
class RemarkClass
{
        public string SqlEyeRamark { get; set; }
        public string FileName { get; set; }
}

它们被填充在

下面
List<WarningClass> lstWarningClass = new List<WarningClass>();
lstWarningClass.Add(new WarningClass { FileName = "a.sql", SqlEyeWarning = "SD001: Set QuotedIdentifier ON statement is missing" });
lstWarningClass.Add(new WarningClass { FileName = "b.sql", SqlEyeWarning = "SD001: Set QuotedIdentifier ON statement is missing" });
lstWarningClass.Add(new WarningClass { FileName = "c.sql", SqlEyeWarning = "SD009: Missing or order mismatch of Grant statement" });
lstWarningClass.Add(new WarningClass { FileName = "a.sql", SqlEyeWarning = "SD009: Missing or order mismatch of Grant statement" });
lstWarningClass.Add(new WarningClass { FileName = "d.sql", SqlEyeWarning = "SD004: Check for existence object then Drop statement before create statement" });

List<RemarkClass> lstRemarkClass = new List<RemarkClass>();
lstRemarkClass.Add(new RemarkClass { FileName = "a.sql", SqlEyeRamark = "SD010: Set AnsiiNullsOn ON statement is missing" });
lstRemarkClass.Add(new RemarkClass { FileName = "b.sql", SqlEyeRamark = "SD002: Order mismatch or it should be ON." });
lstRemarkClass.Add(new RemarkClass { FileName = "c.sql", SqlEyeRamark = "SD002: Order mismatch or it should be ON." });

期望的输出将是

<ScriptFileNames>
    <SqlEye>
        <SqlEyeWarnings Name="Set QuotedIdentifier ON statement is missing">
            <File Name="a.sql" />
            <File Name="b.sql" />
        </SqlEyeWarnings>
        <SqlEyeWarnings Name="SD009: Missing or order mismatch of Grant statement">
            <File Name="a.sql" />
            <File Name="c.sql" />
        </SqlEyeWarnings>
        <SqlEyeWarnings Name="SD004: Check for existence object then Drop statement before create statement">
            <File Name="d.sql" />           
        </SqlEyeWarnings>
        <SqlEyeRemarks Name="SD010: Set AnsiiNullsOn ON statement is missing">
            <File Name="a.sql" />           
        </SqlEyeRemarks>
        <SqlEyeRemarks Name="SD002: Order mismatch or it should be ON.">
            <File Name="b.sql" />   
            <File Name="c.sql" />
        </SqlEyeRemarks>
    </SqlEye>
</ScriptFileNames>

如何使用XDocument类从下面的类中获取XML

 XmlDocument xml = new XmlDocument();
            XmlElement root = xml.CreateElement("ScriptFileNames");
            xml.AppendChild(root);
            XmlElement comment = xml.CreateElement("SqlEye");
            root.AppendChild(comment);
            var WarningClassData = (from items in lstWarningClass
                                    select items).GroupBy(t => t.SqlEyeWarning).ToList();
            foreach (var data in WarningClassData)
            {
                XmlElement SqlEyeWarnings = xml.CreateElement("SqlEyeWarnings");
                SqlEyeWarnings.SetAttribute("Name", data.Key);
                comment.AppendChild(SqlEyeWarnings);
                for (int i = 0; i < data.Count(); i++)
                {
                    XmlElement File = xml.CreateElement("File");
                    File.SetAttribute("Name", data.ElementAt(i).FileName);
                    SqlEyeWarnings.AppendChild(File);
                }
            }
            var RemarkClassData = (from items in lstRemarkClass
                                   select items).GroupBy(t => t.SqlEyeRamark).ToList();
            foreach (var data in RemarkClassData)
            {
                XmlElement SqlEyeRemarks = xml.CreateElement("SqlEyeRemarks");
                SqlEyeRemarks.SetAttribute("Name", data.Key);
                comment.AppendChild(SqlEyeRemarks);
                for (int i = 0; i < data.Count(); i++)
                {
                    XmlElement File = xml.CreateElement("File");
                    File.SetAttribute("Name", data.ElementAt(i).FileName);
                    SqlEyeRemarks.AppendChild(File);
                }
            }
            xml.Save(@"F:''test.xml")

这是一个可以使用的通用数据结构:

class SqlEyeData
{
  public string Name {get;set;}
  public List<string> Filenames {get;set;}
}

这是你可以用来根据你之前的代码填充这些结构的代码(虽然' Bunny'的Linq查询与GroupBy更优雅):

var sqlEyeWarnings = new List<SqlEyeData>();
var uniqueWarningMessages = lstWarningClass.Select(warning => warning.SqlEyeWarning).Distinct().ToList().ForEach(msg => {
  sqlEyeWarnings.Add(new SqlEyeData()
  {
    Name = msg,
    Filenames = lstWarningClass.Where(warning => warning.SqlEyeWarning == msg).Select(warning => warning.FileName).ToList(),
  });
});

我刚刚完成了WarningClass的实现,但备注类一个是完全相同的不同的属性名称。事实上,你可以通过为WarningClass和RemarkClass使用一个类来节省很多麻烦,因为它们之间唯一的区别是字符串属性的名称。

然后你可以这样做来转换使用XDocument:

public XElement GetSqlEyeDataElement(string elementName, SqlEyeData data)
{
    var returnValue = new XElement(elementName,
        new XAttribute("Name", data.Name)
    );
    data.Filenames.ForEach(filename =>
    {
        returnValue.Add(new XElement("File",
            new XAttribute("Name", filename)));
    });
    return returnValue;
}
相关文章: