阅读此XML的好方法是什么?

时间:2010-10-26 12:23:34

标签: c# xml

阅读此XML的好方法是什么?或许我可以用不同的方式构建XML。

我想要的是成为主要事物的过程,然后你可以有任意数量的相关过程。

  <Job>
    <Process>*something.exe</Process>
    <RelatedToProcess>*somethingelse.exe</RelatedToProcess>
    <RelatedToProcess>*OneMorething.exe</RelatedToProcess>
  </Job>

我目前正在使用XmlNodeList并读取innertext然后将字符串拆分为*但我知道必须有更好的方法。

7 个答案:

答案 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)

您可以使用XDocumentXElement

答案 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()
};

如果您有疑问,请告诉我。