2010-10-26 24 views
2

什麼是閱讀此XML的好方法?或者,也許我可以以不同的方式構造XML。什麼是讀取此XML的好方法?

我想要的是過程是主要的東西,然後你可以有任何數量的相關過程要遵循。

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

我目前使用的XmlNodeList和讀取的innerText,然後在拆分*繩子,但我知道必須有一個更好的辦法。

+0

您得到了在解析XML一些很好的意見,但我們在黑暗中是那種爲要與文本內容做什麼。你想在*之前和之後提取子字符串? – LarsH 2010-10-26 13:51:47

回答

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(); 

    } 
} 
5

我建議你使用Linq To Xml。您可以在XDocument中加載您的xml,然後按名稱或路徑訪問每個單獨的XElement

+0

+1我也建議LINQ to XML – 2010-10-26 12:30:51

+0

使用linq,這應該有所幫助:http:// msforge。淨/博客/揚科/存檔/ 2008/03/31/LINQ到XML的查詢,添加,更新,和刪除的XML-data.aspx – 2010-10-26 12:35:59

2

如果你想過程是「主要的」我會建議重組XML作爲

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

這樣,您就可以輕鬆獲得「過程」元素的所有子元素......而在邏輯上它們與(至少對我:))無論你使用的屬性或元素是一個風格的問題...

1

我會實際存儲它稍有不同。 Concept是你創建一個「Process」複雜類型,然後在RelatedProcess中重用它,如果需要,你可以命名一個屬性。

<Job> 
    <Process>something.exe</Process> 
    <RelatedProcess> 
    <Process> 
     <Name>somethingelse.exe</Name> 
    </Process> 
    <Process> 
     <Name>OneMorething.exe 
     </Name> 
    </Process> 
    </RelatedProcess> 
</Job> 

這將允許更好的增長。例如,如果你決定要遞歸processeses即:

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

讓我知道如果你有問題。

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)); 
} 
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