我需要能够通过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);
}
答案 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
}