2015-12-07 58 views
1

我有xml。我使用此代碼檢索信息:當沒有標籤名稱時使用Linq將xml解析爲xml

XNamespace ns = "urn:schemas-microsoft-com:office:excel"; 
      var xdoc = XDocument.Load(@"path"); 

      IEnumerable<string> ss = xdoc.Descendants(ns + "Crn") 
             .Elements(ns + "Text") 
             .Select(x => (string)x); 




      using (System.IO.StreamWriter file = 
      new System.IO.StreamWriter(@"path", true)) 
      { 
       foreach (var x in ss) 
       { 
        file.WriteLine(x); 
       } 
      } 

但我只想檢索最後 - 1標籤文本。我已經添加了文字「這個文字」。我怎樣才能做到這一點? 如果我將添加.LastOrDefault() .Element後它拋出一個錯誤..

這是我的XML

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"> 
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
<SupBook> 
<Xct> 
<Crn> 
      <Row>9</Row> 
      <ColFirst>1</ColFirst> 
      <ColLast>3</ColLast> 
      <Text>02</Text> 
      <Text>this text</Text> 
      <Text>asd</Text> 
     </Crn> 
     <Crn> 
      <Row>10</Row> 
      <ColFirst>1</ColFirst> 
      <ColLast>3</ColLast> 
      <Number>25</Number> 
      <Text>this text</Text> 
      <Text>asd</Text> 
     </Crn> 
     <Crn> 
      <Row>11</Row> 
      <ColFirst>1</ColFirst> 
      <ColLast>3</ColLast> 
      <Number>62</Number> 
      <Text>this text</Text> 
      <Text>asd</Text> 
     </Crn> 
</Xct> 
    </SupBook> 
    </ExcelWorkbook> 
</Workbook> 

我不能改變的XML文件。我知道必須有列名 而不是文本標籤,但它不是我寫的

回答

2

我猜你正在尋找最後一個標籤(通過這個陳述I've added there text "this text".猜到)。

這應該給您預期的結果: -

IEnumerable<string> ss = xdoc.Descendants(ns + "Crn") 
      .Select(x => x.Elements(ns + "Text").Reverse().Skip(1).Take(1).DefaultIfEmpty()) 
      .SelectMany(x => x) 
      .Select(x => (string)x); 

說明: -

可以使用Select第一個項目的所有Text節點。在此之後,您可以反轉序列跳過1元素並取1個元素。爲了安全起見,我添加了DefaultIfEmpty,以防只有1個元素。最後使用SelectMany平滑序列並獲取數據。

0
var ss = xml.Descendants(ns + "Crn") 
    .Select(x => 
    { 
     var a = x.Elements(ns + "Text").ToArray(); 
     return a.Length > 1 ? a[a.Length - 2].Value : ""; 
    }); 

應該這樣做:)

現在獲取倒數第二;)

+1

這是最後一個,而不是最後 - 1. –

+0

AHHH我C:D讓我修復 – sQuir3l

+0

雖然現在正確,但接受的答案是更優雅和linq風格。 –