阅读此XML的好方法是什么?或许我可以用不同的方式构建XML。
我想要的是成为主要事物的过程,然后你可以有任意数量的相关过程。
<Job>
<Process>*something.exe</Process>
<RelatedToProcess>*somethingelse.exe</RelatedToProcess>
<RelatedToProcess>*OneMorething.exe</RelatedToProcess>
</Job>
我目前正在使用XmlNodeList并读取innertext然后将字符串拆分为*但我知道必须有更好的方法。
答案 0 :(得分:5)
我建议您使用Linq To Xml。您可以在XDocument
中加载xml,然后按名称或路径访问每个单独的XElement
。
答案 1 :(得分:4)
试试这个控制台应用:
class Program
{
public class Job
{
public string Process { get; set; }
public IList<string> RelatedProcesses { get; set; }
}
static void Main(string[] args)
{
var xml = "<Job>" +
"<Process>*something.exe</Process>" +
"<RelatedToProcess>*somethingelse.exe</RelatedToProcess>" +
"<RelatedToProcess>*OneMorething.exe</RelatedToProcess>" +
"</Job>";
var jobXml = XDocument.Parse(xml);
var jobs = from j in jobXml.Descendants("Job")
select new Job
{
Process = j.Element("Process").Value,
RelatedProcesses = (from r in j.Descendants("RelatedToProcess")
select r.Value).ToList()
};
foreach (var t in jobs)
{
Console.WriteLine(t.Process);
foreach (var relatedProcess in t.RelatedProcesses)
{
Console.WriteLine(relatedProcess);
}
}
Console.Read();
}
}
答案 2 :(得分:4)
我喜欢将XmlSerializer
用于这样的简单任务,因为它可以显着减少处理XML的代码。您所需要的只是一个映射到XML的简单类,例如
public class Job
{
public string Process { get; set; }
[XmlElement("RelatedToProcess")]
public List<string> RelatedProcesses { get; set; }
}
然后您可以像这样阅读XML:
XmlSerializer serializer = new XmlSerializer(typeof(Job));
using (var reader = XmlReader.Create(@"d:\temp\test.xml"))
{
Job j = (Job)serializer.Deserialize(reader);
Console.WriteLine(j.Process);
Console.WriteLine(j.RelatedProcesses.Count);
j.RelatedProcesses.ForEach(p => Console.WriteLine(p));
}
答案 3 :(得分:2)
您可以使用XDocument
和XElement
答案 4 :(得分:2)
如果您希望Process成为“主要内容”,我建议将XML重组为
<Job>
<Process Name="*.something.exe">
<RelatedToProcess>*somethingelse.exe</RelatedToProcess>
<RelatedToProcess>*OneMorething.exe</RelatedToProcess>
</Process>
</Job>
通过这种方式,您可以轻松获取“Process”元素的所有子元素......并且逻辑上它们相关(至少对我来说:))无论您使用属性还是元素都是风格问题......
答案 5 :(得分:2)
XDocument肯定!
XDocument xDoc = XDocument.Load("Process.xml");
var process = from p in xDoc.Descendants("Process")
select p.Value;
var relatedProcess = from p in xDoc.Descendants("RelatedToProcess")
select p.Value;
Console.WriteLine("Process: {0}", process.ElementAtOrDefault(0).ToString());
foreach (var p in relatedProcess)
Console.WriteLine("RelatedToProcess: {0}", p);
代码将打印:
Process: *something.exe
RelatedToProcess: *somethingelse.exe
RelatedToProcess: *OneMorething.exe
答案 6 :(得分:1)
我实际上会存储它略有不同。概念是您创建一个“Process”复杂类型,然后在RelatedProcess中重用它,如果需要,您可以将name设为属性。
<Job>
<Process>something.exe</Process>
<RelatedProcess>
<Process>
<Name>somethingelse.exe</Name>
</Process>
<Process>
<Name>OneMorething.exe
</Name>
</Process>
</RelatedProcess>
</Job>
这将有助于更好的增长。例如,如果您决定进行递归处理,即:
<Job>
<Process>
<Name>something.exe</Name>
<RelatedProcess>
<Process>
<Name>somethingelse.exe</Name>
<RelatedProcess>
<Process>
<Name>recursive.exe</Name>
</Process>
</RelatedProcess>
</Process>
<Process>
<Name>OneMorething.exe</Name>
</Process>
</RelatedProcess>
</Process>
</Job>
这是一个XDocument示例..我没有显示进程的递归创建,因为我不确定您是否要使用它。
string xml = "<Job>...xml here ";
XDocument doc = XDocument.Parse(xml);
var Processess = from process in doc.Elements("Job").Elements("Process")
select new
{
ProcessName = process.Element("Name"),
RelatedProcesses = (from rprocess in process.Elements("RelatedProcess").Elements("Process")
select new
{
ProcessName = rprocess.Element("Name")
}
).ToList()
};
如果您有疑问,请告诉我。