2016-08-25 87 views
1

我試圖修復一段代碼,它沒有做我想做的事情。該代碼由一位聲稱工作完美的工程師留下。他一直在使用XPATH而不是Linq,所以在短期內我正在尋找基於XPATH的解決方案。XML中的所有子節點都鏈接到一個父節點

我搜索了網頁,但無法將我發現的內容轉換爲工作解決方案。

的XML看起來像:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Orders> 
    <Order> 
     <OrderId>6175</OrderId> 
     <OrderNumber>6175</OrderNumber> 
     <OrderDate>2016-08-19 13:17:41</OrderDate> 
     <OrderLineItems> 
      <ItemName>Name of Item</ItemName> 
      <Quantity>1</Quantity> 
      <Meta/> 
     </OrderLineItems> 
    </Order> 
</Orders> 

他與Visual Studio 2008中的擔憂讀取XML看起來像創建的腳本:

public override void CreateNewOutputRows() 
    { 
     string filename = Variables.strFileInLoop; 

     XmlDocument doc = new XmlDocument(); 
     doc.Load(filename); 


     // loop orders 
     foreach (XmlNode shipmentNode in doc.DocumentElement.SelectNodes("/Orders/Order")) 
     { 
      OutputOrdersBuffer.AddRow(); 
      String OrderId = GetNodeText("OrderId", shipmentNode).Trim(); 
      OutputOrdersBuffer.OrderId = OrderId; 
      OutputOrdersBuffer.OrderNumber = GetNodeText("OrderNumber", shipmentNode).Trim(); 
      OutputOrdersBuffer.OrderDate = GetNodeText("OrderDate", shipmentNode).Trim(); 
      String replace = @"C:\Projects\Customername\IN\"; 
      OutputOrdersBuffer.FileName = filename.Replace(replace, ""); 

       foreach (XmlNode OrderLineItemNode in shipmentNode.SelectNodes("/Orders/Order/OrderLineItems")) 
       { 
        OutputOrderLinesBuffer.AddRow(); 
        OutputOrderLinesBuffer.OrderId = OrderId; 
        OutputOrderLinesBuffer.ItemName = GetNodeText("ItemName", OrderLineItemNode).Trim(); 
        OutputOrderLinesBuffer.Quantity = GetNodeText("Quantity", OrderLineItemNode).Trim(); 
        OutputOrderLinesBuffer.Meta = GetNodeText("Meta", OrderLineItemNode).Trim(); 

       } 

     } 
    } 

當我們嘗試導入多的XML會發生什麼訂單是代碼將所有OrderLineItems附加到所有訂單。

所以,如果有2個OrderLineItems的文件中有10個獨特的訂單,它會發出10個訂單,每個訂單有20個OrderLineItems。

正如我所說,我到處尋找(我認爲),但無法將我發現的解決方案轉換爲OrderLineItems僅與其所屬訂單鏈接的解決方案。

+0

也許你應該使用OutputOrdersBuffer.OutputOrderLinesBuffer.AddRow();等等...... – Fruchtzwerg

回答

0

的順序內的迭代使用一個的XPath表達式

/Orders/Order/OrderLineItems 

穿過整個文檔每時間的推移,作爲起始/中表示。這就是爲什麼所有訂單項都包含在所有訂單中的原因。

更改的XPath表達採取shipmentNode作爲上下文項,如果的XPath表達不以/開始其隱含發生,並從那裏導航到其OrderLineItems孩子應該幫助:

foreach (XmlNode OrderLineItemNode in shipmentNode.SelectNodes("OrderLineItems")) 

與命令行上的文件系統的類比通常有助於在啓動時XPath:上下文項的行爲與工作目錄類似,可以使用絕對路徑更改目錄(startin g與/),或者與當前目錄的相對路徑(從./開始,這也適用於XPath)。當然XPath不同,因爲它是面向集合的,但這種類比有助於進入正確的導航思維模式。

+0

謝謝!這樣可行!我一直在尋找幾天,我發現它必須是Xpath表達式中的某些東西,但永遠不能弄清楚什麼。剛剛嘗試了25個訂單和28個行的文件,而不是獲得700個訂單,輸出是我需要的!太感謝了!!! –

相關問題