2016-09-14 2 views
0

Ich habe eine Frage. Ich versuche eine entfernte XML-Datei zu lesen. alles funktioniert gut, außer der Linq-Abfrage gibt es immer nichts zurück.XML Linq zurückgeben nichts Office-Add-Ins

habe ich diesen Code:

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"); 

und es zeigt immer null.

dies ist ein Teil des 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"/> 

ich mit XML nicht, dass Experte bin. also bitte, wenn du mir helfen kannst, dieses Problem zu lösen. und geben Sie mir eine Erklärung. es wäre toll.

vielen Dank.

+1

Ich würde vermuten, dass 'ConnectToXM (URL)' nicht tatsächlich ein XDocument zurückgibt, das darstellt, was Sie gepostet haben. Was Sie gepostet haben, hat kein Wurzelelement, und XDocument kann nicht einmal XML ohne ein Wurzelelement laden. –

+0

Ich überprüfe nur das Dokument, das von dieser Methode zurückkommt, die genau mit der XML-Datei übereinstimmt. alle Arbeiten finden. nur wenn ich lesen möchte, wenn ich schreibe: MessageBox.Show (doc + ""); zeigt es alle XML-Datei –

Antwort

1

Endlich funktioniert es 1) Sie können die Zeichen & ',' ä 'in der XML-Datei nicht haben. 2) Sie benötigen einen Namespace für die linq arbeiten 3) Verwenden Sie nicht die Eigenschaft 'Value', wenn einige der Elemente nicht alle Attribute haben. Es gibt einen Nullfehler. Stattdessen wie ich unten getan habe. Hier

wird xml aktualisiert

<?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

Es funktioniert Mann, vielen Dank für die Lösung und für die Erklärung. nur um etwas zu erwähnen: gibt es kein Problem, denke ich mit dem Buchstaben "ä", weil es in der deutschen Tastatur erkannt. aber der Name Raum und das Attribut war völlig richtig. Vielen Dank –

1

Ein qualifizierter Name in XML besteht aus einem Namensraum und einen lokalen Namen. Sie haben den lokalen Namen Details abgefragt, aber den Namespace nicht berücksichtigt. Der Namespace ist der Standardwert (da kein Präfix für den Namen vorhanden ist und der Standardnamespace durch das xmlns="..."-Attribut für ein Element oder ein beliebiges Elternelement definiert wird. In diesem Fall befindet sich das Element im Stammverzeichnis Report - der Namensraum ist ProfilpflegeStatus

Sie können in Ihrer Abfrage wie folgt verwenden diese:

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

Sobald Sie diese Arbeit haben, würde ich nicht, dass einige der Attribute sind Sie die Auswahl nicht existieren. auf allen Details Elementen.Sie können damit umgehen, indem Sie uns die expliziten Conversions a vailable, die den Fall behandelt, in dem die zurückgegeben null ist. Zum Beispiel:

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

Sie haben Recht, danke. aber leider kann ich zwei Antworten nicht richtig machen. aber danke –