tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
27
ZUGRIFFE
2092
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    ich versuche zurzeit mit XPath und .NET bestimmte Daten aus einer XML Datei zu lesen.

    Ich verwende dabei die Klasse System.Xml.XmlDocument. Ich glaube jedoch, dass ich dafür irgendwie zu blöd bin, denn wenn ich mir mit einem XPATH Ausdruck einen NodeList zurückgeben lasse, enthält diese immer 0 Elemente.

    Hier mal ein Beispiel:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    <AUTOSAR ...>
      <ADMIN-DATA>
         ...
      </ADMIN-DATA>
      <TOP-LEVEL-PACKAGES>
         ...
      </TOP-LEVEL-PACKAGES>
      ...
    </AUTOSAR>

    Code :
    1
    
    XmlNodeList nodeList = arxmlDocument.SelectNodes("/child::TOP-LEVEL-PACKAGES");

    Was mache ich falsch ?
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.

    Das / ist das Dokument Element. Dieses Element hat immer genau einen Kindknoten: das Root-Element (hier AUTOSAR).

    Also
    Code :
    1
    
    /child::AUTOSAR/child::TOP-LEVEL-PACKAGES
    oder natürlich einfach
    Code :
    1
    
    /AUTOSAR/TOP-LEVEL-PACKAGES
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    danke für die schnelle Antwort. In der Form hatte ich es auch schon versucht, dies hatte auch 0 Elemente zurückgegeben.

    Ich habe es eben auch nochmal wiederholt, wieder das gleiche ...
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Zitat Zitat von Tikonteroga Beitrag anzeigen
    Hallo,

    danke für die schnelle Antwort. In der Form hatte ich es auch schon versucht, dies hatte auch 0 Elemente zurückgegeben.

    Ich habe es eben auch nochmal wiederholt, wieder das gleiche ...
    Bei mir funktioniert es wie erwartet.

    Es werden nicht zufällig Namensräume verwendet?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Was mir auch aufgefallen ist, ist das folgendes funktioniert.

    Code :
    1
    
    /*

    Aber folgendes nicht funktioniert.

    Code :
    1
    
    /AUTOSAR
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Vermutlich werden in dem XML Dokument Namensräume verwendet. Du mußt erstens einen Präfix für den Namensraum definieren und dann natürlich den Namensraum auch verwenden:
    Code :
    1
    
    /ns:AUTOSAR
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    ich habe jetzt schon einiges versucht, erhalte dann aber eine Exception.

    Ich habe mal einen ausgeschwarzten Root angehängt.

    Code :
    1
    
    <AUTOSAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="..." xsi:schemaLocation="..." T="...">
     

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Also in meinem XML Dokument wird zwar ein Namensraum definiert, aber ihm wird kein Prefix zugewiesen. Ich kann also keinen Prefix in den XPath-Ausdruck einbauen.

    Aber wenn ich einen XPath-Ausdruck ohne Prefix verwende, erhalte ich eine leere Menge ...

    Ich weiss jetzt immernoch nicht woran es liegt. Wenn ich das Problem über Google, über das ich diesen Artikel auch schon gefunden hatte, hätte lösen können, hätte ich nicht hier gepostet ...
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Es ist völlig egal welcher Präfix im XML Dokument für einen Namensraum vereinbart wird. Vereinbare einfach einen (siehe das Codebeispiel) und verwende ihn.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    danke für den Hinweis.

    Ich konnte es nun so lösen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    XmlDocument arxmlDocument = new XmlDocument();                      //Speicher reservieren
     
    try
    {
         arxmlDocument.Load(this.arxml);                                                //ARXML Datei einlesen
     
         XmlNamespaceManager arxmlNamespaceManager 
              = new XmlNamespaceManager(arxmlDocument.NameTable);
     
         string namespaceURI 
              = arxmlDocument.DocumentElement.NamespaceURI;               //Namensraum lesen
     
         arxmlNamespaceManager.AddNamespace("ns", namespaceURI);      //Prefix für Namensraum festlegen
     
         XmlNodeList nodeList = arxmlDocument
              .SelectNodes("/ns:AUTOSAR", arxmlNamespaceManager);         //Root-Knoten auswählen
     
         foreach (XmlNode node in nodeList)
         {
              System.Console.WriteLine(node.Name);                                 //Root-Knoten über Konsole ausgeben
         }
    }
    catch
    {
         throw;
    }
    finally
    {
         arxmlDocument.RemoveAll();                                      //Speicher freigeben
    }

    Gibt es da was auszusetzen ?
    Geändert von Tikonteroga (18.10.11 um 13:12 Uhr)
     

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Warum liest du denn den Namensraum aus dem Dokument aus?

    Normalerweise sollte man doch wissen um welche Art von Dokument es sich handelt und ebenfalls den Namensraum kennen um den es geht.

    So würdest du beliebige Dokumente verarbeiten, die nicht mal im entferntesten etwas mit deinem eigentlichen Zieldokument zu tun haben...

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  13. #13
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hmm ich bin davon ausgegangen, dass ich die Dokumente, die ich verarbeite letztendlich vorher auf das zugehörige XML-Schema validiere.

    Und wollte halt vermeiden in meinem Code zu viele String Literale zu verwenden. Da meckert glaub sonst FxCop ...
     

  14. #14
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    ich habe aktuell folgende Problemstellung.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    <AR-PACKAGE>
       <ELEMENTS>
          <FRAME/>
          <FRAME/>
          <FRAME/>
       </ELEMENTS>
    </AR-PACKAGE>
    <AR-PACKAGE>
       <ELEMENTS>
          <SYSTEM-SIGNAL/>
          <SYSTEM-SIGNAL/>
          <SYSTEM-SIGNAL/>
       </ELEMENTS>
    </AR-PACKAGE>
    <AR-PACKAGE>
       <ELEMENTS>
          <COMPU-METHOD/>
          <COMPU-METHOD/>
          <COMPU-METHOD/>
       </ELEMENTS>
    </AR-PACKAGE>

    Ich habe als eine Sequenz der Knoten AR-PACKAGE. Jeder Knoten AR-PACKAGE enthält einen Knoten ELEMENTS. Der Knoten ELEMENTS kann entweder eine Sequenz aus FRAME, SYSTEM-SIGNAL oder COMPU-METHOD enthalten kann.

    Ist es möglich über X-PATH alle Knoten mit dem Namen FRAME zu erhalten, wenn ich davon ausgehen muss dass die Reihenfolge der AR-PACKAGE Knoten zufällig sein kann oder muss ich hier alle AR-PACKAGE Knoten in einer Schleife (foreach) durchsuchen ?
     

  15. #15
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.

    Ich verstehe nicht wo das Problem ist.

    Mit
    Code :
    1
    
    AR-PACKAGE/ELEMENTS/FRAME
    selektierst du alle FRAME Knoten (ausgehend vom Kontextknoten), die unterhalb von AR-PACKAGE und unterhalb von ELEMENTS liegen...

    War das deine Frage?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 01.02.10, 13:58
  2. C# XML datei Knoten finden per XPath
    Von Heavenfighter im Forum .NET Datenverwaltung
    Antworten: 4
    Letzter Beitrag: 27.01.09, 14:22
  3. Antworten: 12
    Letzter Beitrag: 22.04.07, 09:03
  4. xsl - xpath aus xml-datei benutzen
    Von Valiant im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 02.06.05, 20:33
  5. Antworten: 4
    Letzter Beitrag: 22.04.05, 14:16