使用LINQ

时间:2016-04-18 02:05:48

标签: c# xml linq

我需要能够通过ServerGroup跟踪工作项。每个ServerGroup可能有多个FaultCodes。

我应该使用哪种最佳XML布局? 选项A或B?我能够创建一个linq查询来搜索选项A.但是我不确定如何检查故障代码。所以,我认为选项B,因为它允许我分组ServerGroup和FaultCode。当xml的结构类似于选项B时,是否可以执行linq搜索?

感谢您的帮助。

<?xml version="1.0" encoding="utf-16"?>
<CapacityIssues xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    **//Option A**
    <TrackingDetails>
        <ServerGroup>A</ServerGroup>
        <FaultCode>123</FaultCode>
        <ID>4123567</ID>
        <Title>Capacity Issues</Title>
        <AssignedTo>Team A</AssignedTo> 
        <Description>Server Group A has an issue</Description>
        <State>Active</State>
        <Priority>2</Priority>
    </TrackingDetails>

     **//Option B**
    <TrackingDetails ServerGroup="A" FaultCode="123">
        <ID>4123567</ID>
        <Title>Capacity Issues</Title>
        <AssignedTo>TeamA</AssignedTo>
        <Description>This is a test</Description>
        <State>Active</State>
        <Priority>0</Priority>
    </TrackingDetails>

</CapacityIssues>

我能够使用选项A进行搜索,这是我编写的代码。

public static Dictionary&gt; TFS(字符串文件路径)     {         //设置要读取的文档类型         XDocument doc = XDocument.Load(filePath);

    //execute reading of xml document
    if (doc == null || doc.Root == null)
    {
        throw new ArgumentException($"Null document loaded from {filePath}");
    }

    return doc.Root.Elements("TfsDetails").ToDictionary(r => 
        r.Element("ServerGroup").Value,
        r => Tuple.Create(
            r.Element("FaultCode").Value, 
            r.Element("ID").Value, 
            r.Element("Title").Value, 
            r.Element("AssignedTo").Value, 
            r.Element("Description").Value, 
            r.Element("State").Value, 
            r.Element("Priority").Value
            ));
}

以下是我如何将Option B元素添加到XML文件

private static void Create(string filePath)
{
    //load xml file
    XDocument doc = XDocument.Load(filePath);

    //xmnl header
    XElement root = new XElement("CapacityIssues");

    //node root
    root.Add(new XAttribute("ServerGroup", "A"));

    //cluster and TFS details
    root.Add(new XAttribute("FaultCode", "111"));
    root.Add(new XElement("ID", "4123567"));
    root.Add(new XElement("Title", "Capacity Issues"));
    root.Add(new XElement("AssignedTo", "Team A"));
    root.Add(new XElement("Description", "ServerGroup A has an issue"));
    root.Add(new XElement("State", "Active"));
    root.Add(new XElement("Priority", "0"));

    //add new element
    doc.Element("CapacityIssues").Add(root);

    //save xml file
    doc.Save(filePath);
}

1 个答案:

答案 0 :(得分:1)

虽然两者都是有效的,但是推荐是选项B(使用属性而不是元素),因为它的深度较小。

您可以使用linq作为Attributes,如下所示。

foreach (var xAttribute in root.Descendants("TrackingDetails").Attributes().Where(o => o.Name.Equals("ServerGroup")))
{
    // do something about ServerGroup A or B
}