2010-09-02 106 views
4

我有一個XML文件,它看起來像這樣XML數據結構

<step> 
    <id>3</id> 
    <backid>1</backid> 
    <question>Are you having a good day</question> 
    <yesid>4</yesid> 
    <noid>5</noid> 
     </step> 

它的成立是詢問用戶是的,沒有問題,以協助通過一個複雜的業務流程引導用戶的應用程序。 yesid和noid是進程下一步的id號。在過去(和其他語言),我會從xml文件加載信息到多維數組,然後從那裏離開。

但是我試圖在這個應用程序中使用的LINQ to XML,我想知道是否有這樣做比XPath來排列,我已經在過去

+1

如果您有嚴格的格式,則可能還會查看XSD並使用xsd.exe生成模式和類。 – 2010-09-02 20:28:33

回答

6

我會創造已經做的更有效的方法

var doc = XDocument.Load("xmlfile1.xml"); 

var steps = from step in doc.Root.Elements("step") 
      select new Step 
        { 
         Id  = (int)step.Element("id"), 
         BackId = (int)step.Element("backid"), 
         Question = (string)step.Element("question"), 
         YesId = (int)step.Element("yesid"), 
         NoId  = (int)step.Element("noid"), 
        }; 

var dict = steps.ToDictionary(step => step.Id); 

var currentStep = dict[3]; 

while (true) 
{ 
    switch (Ask(currentStep.Question)) 
    { 
     case Yes: currentStep = dict[currentStep.YesId]; break; 
     case No: currentStep = dict[currentStep.NoId]; break; 
     case Back: currentStep = dict[currentStep.BackId]; break; 
     default: return; 
    } 
} 

(假設該文件包含下一個數<步驟>元素:表示的工序的類,使用LINQ到XML,然後創建的,便於查找步驟的字典讀取XML文件轉換成它共同根)。

+1

哇,我從來沒有意識到,XElement定義了顯式轉換爲原始類型......比'int.Parse(step.Element(「id」)。)更方便。 – 2010-09-02 23:19:15