2014-07-23 71 views
0

好吧,我有一個小問題,閱讀我公司的臭名昭着的畸形XML文件之一。C#讀取標籤內部的XML(內部?)

嘗試從中獲取5個值並將它們單獨保存爲變量。

下面是一個棘手的XML示例。
(我可能沒有使用正確的術語,但我無法找到這種類型的閱讀價值的任何東西)

<ONE> 
    <TWO> 
     <THREE> 
     </THREE> 
    </TWO> 
    <DATA internalid="1" externalid="2" lastname="lname" firstname="name" date="20.03.2003"/> 
</ONE> 

所以,我需要的數據是internalid,外部ID,姓氏,名字和日期。

到目前爲止,我一直在努力工作,無法做出任何事情。

string xml = (@"C:\1.xml"); 
var xmlElement = XElement.Load(xml); 
var xmlList = (from message in xmlElement.Elements("DATA") 
       select new 
       { 
        internalid = message.Attribute("internalid").Value, 
        externalid = message.Attribute("externalid").Value, 
        lastname = message.Attribute("lastname").Value, 
        firstname = message.Attribute("firstname").Value, 
        date = message.Attribute("date").Value 
       }).ToString(); 

而且我無法讓它飛起來。這並不是說我得到任何錯誤,但是當我走出這個字符串到一個RichTextBox或只是文本我得到這個....

System.Linq.Enumerable + WhereSelectEnumerableIterator 2[System.Xml.Linq.XElement,<>f__AnonymousType0 5 System.String,系統。字符串,System.String,System.String,System.String]]

此外,所以我可以更好地研究這個問題,當數據是INSIDE標籤時,它是什麼叫做?

謝謝你們!

+1

嗯,是的,你在序列上調用'ToString()'。你期望結果是什麼,爲什麼?這對我來說完全不像一個XML問題。此外,請更多關注帖子中代碼的格式 - 不需要所有縮進。 –

+1

您應該將方法'ToString()'直接應用於XElement對象,或者創建自定義類型,而不是使用帶有overriden ToString的匿名類。但無論如何,你會得到enumerable作爲你的linq查詢的輸出。你可以應用類似'String.Join(linqResult.Select(x => x.ToString()))' –

+0

現在明白了,從ToString切換到ToList ....有一個很好的輸出。它的工作原理。現在正致力於將此列表變爲單個字符串或變量...... – Redracer68

回答

1

由於@Jon Skeet提到你在序列上調用ToString()。以下代碼可能會讓您更接近您所期望的解決方案。

var xmlList = (from message in xmlElement.Elements("DATA") 
       select new 
       { 
        internalid = message.Attribute("internalid").Value, 
        externalid = message.Attribute("externalid").Value, 
        lastname = message.Attribute("lastname").Value, 
        firstname = message.Attribute("firstname").Value, 
        date = message.Attribute("date").Value 
       }); 

StringBuilder builder = new StringBuilder(); 
foreach (var item in xmlList) 
{ 
    builder.Append(item); 
} 
string test = builder.ToString(); 

至於你關於「數據是INSIDE標籤那樣的問題」的問題。這些是XML Attributes的示例。

這裏有一個很好的資源,開始學習linq Introduction to LINQ Queries (C#)

1

如何讀取數據並保存到變量中沒有任何問題。要顯示數據,不要試圖將xmlList對象轉換爲字符串,只需遍歷列表以輸出數據即可。

string xml = (@"C:\1.xml"); 
var xmlElement = XElement.Load(xml); 
var xmlList = (from message in xmlElement.Elements("DATA") 
     select new 
     { 
      internalid = message.Attribute("internalid").Value, 
      externalid = message.Attribute("externalid").Value, 
      lastname = message.Attribute("lastname").Value, 
      firstname = message.Attribute("firstname").Value, 
      date = message.Attribute("date").Value 
     }); 

StringBuilder outputString = new StringBuilder(); 
foreach (var xmlRecord in xmlList) 
{ 
    string outputRecord = 
     string.Format("internalid: {0}, externalid: {1}, lastname: {2}, firstname: {3}, date: {4}", 
     xmlRecord.internalid.ToString(), xmlRecord.externalid.ToString(), 
     xmlRecord.lastname.ToString(), xmlRecord.firstname.ToString(), 
     xmlRecord.date.ToString()); 
    outputString.AppendLine(outputRecord); 
} 
Console.WriteLine(outputString.ToString()); 
Console.ReadLine();