2016-09-14 57 views
0

我有一個問題。我正在嘗試讀取遠程XML文件。 一切工作正常,除了Linq查詢它總是什麼都不返回。XML Linq返回什麼辦公室加載項

我用這個代碼:

XDocument doc = ConnectToXML(url); 
    List<LongProfile> result = doc.Descendants("Details").Select(x => new LongProfile 
        { 
         Firstname = x.Attribute("Textbox10").Value, 
         Lastname = x.Attribute("Textbox8").Value, 
         TeamLeader = x.Attribute("Textbox5").Value, 
         Status = x.Attribute("Textbox26").Value, 
         Date = x.Attribute("Textbox14").Value 
        }).ToList(); 

    if (result.Count == 0) MessageBox.Show("null"); 

,它始終顯示爲空。

這是XML

<?xml version="1.0" encoding="UTF-8"?> 

-<Report xmlns="ProfilpflegeStatus" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="ProfilpflegeStatus" xsi:schemaLocation="ProfilpflegeStatus http://bitreporting/ReportServer?%2FSkillscout%2FProfilpflegeStatus&rs%3AFormat=XML&rc%3ASchema=True"> 


-<Tablix1> 


-<Details_Collection> 

<Details Textbox15="Klaus Baumgärtner" Textbox5="Marketing Kommunikation" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Mona" Textbox8="Aalfeld"/> 

<Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Frank" Textbox8="Abegg" Textbox14="2013-03-11T19:18:22.513" Textbox12="Service Management"/> 

<Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Ja" Textbox10="Frank" Textbox8="Abegg" Textbox14="2016-09-08T23:21:45" Textbox12="Standard" Textbox24="2016-09-08T23:21:45"/> 

<Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Frank" Textbox8="Abegg" Textbox14="2012-11-29T01:51:13.16" Textbox12="Testing"/> 

<Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Frank" Textbox8="Abegg" Textbox14="2013-05-14T22:50:08.53" Textbox12="Testmanagement"/> 

的一部分,我不是專家,XML。所以請如果你能幫我解決這個問題。並給我提供一些解釋。這會很棒。

非常感謝。

+1

我猜'ConnectToXM(url)'實際上並沒有返回一個XDocument來表示你發佈的內容。你發佈的內容沒有根元素,XDocument甚至無法加載沒有根元素的XML –

+0

我只是檢查從這個方法返回的文檔,它與XML文件完全相同。 所有作品找到。只有當我想要讀取 時:MessageBox.Show(doc +「」); 它顯示所有的XML文件 –

回答

1

終於搞定了 1)在xml文件中不能有字符'&','ä'。 2)你需要一個命名空間讓linq工作 3)當某些元素沒有所有屬性時,不要使用屬性「值」。它給出一個空錯誤。相反,像我在下面做的那樣。

這裏更新XML

<?xml version="1.0" encoding="UTF-8"?> 
<Report xmlns="ProfilpflegeStatus" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="ProfilpflegeStatus" xsi:schemaLocation="ProfilpflegeStatus http://bitreporting/ReportServer?%2FSkillscout%2FProfilpflegeStatusU+0026%3AFormat=XMLU+0026%3ASchema=True"> 
    <Tablix1> 
    <Details_Collection> 
     <Details Textbox15="Klaus Baumgärtner" Textbox5="Marketing Kommunikation" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Mona" Textbox8="Aalfeld"/> 
     <Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Frank" Textbox8="Abegg" Textbox14="2013-03-11T19:18:22.513" Textbox12="Service Management"/> 
     <Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Ja" Textbox10="Frank" Textbox8="Abegg" Textbox14="2016-09-08T23:21:45" Textbox12="Standard" Textbox24="2016-09-08T23:21:45"/> 
     <Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Frank" Textbox8="Abegg" Textbox14="2012-11-29T01:51:13.16" Textbox12="Testing"/> 
     <Details Textbox15="Marc Schmitt" Textbox5="Marc Schmitt" Textbox3="Mannheim" Textbox26="Nein" Textbox10="Frank" Textbox8="Abegg" Textbox14="2013-05-14T22:50:08.53" Textbox12="Testmanagement"/> 
    </Details_Collection> 
    </Tablix1> 
</Report> 







using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      XElement report = (XElement)doc.FirstNode; 
      XNamespace ns = report.GetDefaultNamespace(); 

      List<LongProfile> result = doc.Descendants(ns + "Details").Select(x => new LongProfile() { 
       Firstname = (string)x.Attribute("Textbox10"), 
       Lastname = (string)x.Attribute("Textbox8"), 
       TeamLeader = (string)x.Attribute("Textbox5"), 
       Status = (string)x.Attribute("Textbox26"), 
       Date = x.Attribute("Textbox14") == null ? new DateTime() :(DateTime)x.Attribute("Textbox14") 
      }).ToList(); 

     } 
    } 
    public class LongProfile 
    { 
     public string Firstname { get; set; } 
     public string Lastname { get; set; } 
     public string TeamLeader { get; set; } 
     public string Status { get; set; } 
     public DateTime Date { get; set; } 
    } 
} 
+0

它工作的人,非常感謝您的解決方案和解釋。只是提一些事情: 有沒有問題,我猜字母「ä」,因爲它在德國鍵盤識別。 但名稱空間和屬性是完全正確的。非常感謝你 –

1

XML中的限定名是由一個命名空間和一個本地名。您使用本地名稱Details進行了查詢,但沒有考慮名稱空間。

命名空間是默認的(因爲名稱上沒有'前綴',默認名稱空間由元素或任何父元素上的xmlns="..."屬性定義,在這種情況下,它位於根元素Report中 - 名稱空間是ProfilpflegeStatus

您可以在查詢中使用這像這樣:

XNamespace ns = "ProfilpflegeStatus"; 
var details = doc.Descendants(ns + "Details"); 

一旦你有這方面的工作,我不就是一些屬性你選擇是不存在的。在所有的Details元素上,你可以通過明確的轉換來處理這個問題vailable將處理XAttribute返回的情況是null。例如:

Firstname = (string)x.Attribute("Textbox10") 
+0

你是對的,謝謝。但不幸的是,我不能作出正確的兩個答案。但是謝謝你 –