AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML C# [XML] XPath in XML-Dokument (mit XML-Namespace) greift nicht
Thema durchsuchen
Ansicht
Themen-Optionen

[XML] XPath in XML-Dokument (mit XML-Namespace) greift nicht

Ein Thema von Phoenix · begonnen am 11. Sep 2006 · letzter Beitrag vom 11. Sep 2006
Antwort Antwort
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.610 Beiträge
 
#1

[XML] XPath in XML-Dokument (mit XML-Namespace) greift nicht

  Alt 11. Sep 2006, 08:28
Hi,

folgendes Problem: Ich habe ein Infopath Dokument. Das sieht in etwa so aus:

XML-Code:
<?xml version="1.0" encoding="UTF-8"?>
<?mso-infoPathSolution solutionVersion="1.0.0.72" productVersion="12.0.0" PIVersion="1.0.0.0"
href="file:///C:\blaflasel\file.xml"
name="urn:schemas-microsoft-com:office:infopath:Document-Name:-myXSD-2006-02-09T21-22-41" ?>
<?mso-application progid="InfoPath.Document"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-02-09T21:22:41"
xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="de">
   <my:edName>Sebastian Gingter</my:edName>
   <my:edJahr>2006</my:edJahr>
   <my:edMonat>09</my:edMonat>
   <my:edKW>36</my:edKW>
   <my:timeEntries>
      <my:timeEntry>
         <my:dtArbeitstag>2006-09-04</my:dtArbeitstag>
         <my:startTime>17:00:00</my:startTime>
         <my:endTime>18:00:00</my:endTime>
         <my:edAuftragsnummer>123456</my:edAuftragsnummer>
         <my:startBreakTime>17:15:00</my:startBreakTime>
         <my:endBreakTime>17:30:00</my:endBreakTime>
         <my:memoTaetigkeit>TEST</my:memoTaetigkeit>
         <my:lookIBN>X</my:lookIBN>
         <my:lookTaetigkeit>IT-SW</my:lookTaetigkeit>
         <my:totalHours>0.75</my:totalHours>
      </my:timeEntry>
      <my:timeEntry>
         <my:dtArbeitstag>2006-09-05</my:dtArbeitstag>
         <my:startTime xsi:nil="true"></my:startTime>
         <my:endTime xsi:nil="true"></my:endTime>
         <my:edAuftragsnummer></my:edAuftragsnummer>
         <my:startBreakTime xsi:nil="true"></my:startBreakTime>
         <my:endBreakTime xsi:nil="true"></my:endBreakTime>
         <my:memoTaetigkeit></my:memoTaetigkeit>
         <my:lookIBN></my:lookIBN>
         <my:lookTaetigkeit>IT-SW</my:lookTaetigkeit>
         <my:totalHours xsi:nil="true"></my:totalHours>
      </my:timeEntry>
                <my:grandTotal>0.75</my:grandTotal>
   </my:timeEntries>
</my:myFields>
(Ja, das ist für ne Mini-Zeiterfassung ).

Jedenfalls will ich in nun die mit Infopath erstellten XML-Files mit einem eigenen Programm auswerten. Dazu benutze ich stand jetzt folgenden Code:

Code:
XmlDataDocument xmldoc = new XmlDataDocument();
           
xmldoc.Load(fileName);
XmlNamespaceManager nsManager = new XmlNamespaceManager(xmldoc.NameTable);        
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-04-20T16:26:21");
   
XmlNode name = xmldoc.SelectSingleNode("my:myFields/my:edName", nsManager);
if (name != null)
{
   String strName = name.ToString();
   System.Windows.Forms.MessageBox.Show(strName);
}
In Filename steht die Adresse zu einem entsprechenden File, das öffnen etc. tut auch.

Das Problem liegt in der Zeile: XmlNode name = xmldoc.SelectSingleNode("my:myFields/my:edName", nsManager);
Der XMLNode name ist danach leider Null, was er nicht sein sollte. In dem File sieht jeder, dass der Node existiert und da mein Name drin steht.

Den Code mit dem Namespace hinzufügen habe ich aus dem MSDN:
Hier direkt zu Infopath: (langer link)
Und hier der normale XPath-Eintrag: http://msdn2.microsoft.com/de-de/library/d6730bwt.aspx

Wieso tut die Namespace-auflösung nicht bzw. was genau muss ich tun, damit ich per XPath auf die Nodes zugreifen kann?

Aso: ich habe folgende Variationen schon probiert:
  • my:myFields/my:edName
  • /my:myFields/my:edName
  • my:edName
  • /my:edName
(Wobei Nummer 2 der XPath ist, den mir Infopath selber liefert und Nr. 1 der ist, der dem Codebeispiel aus dem MSDN folgt).

Aso.. Nachtrag: Ich benutze freilich .NET 2.0.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n

  Alt 11. Sep 2006, 14:04
Hallo Sebastian,

C# und .NET ignoriere ich eigentlich so gut ich kann, aber wenn du meinen Code lesen kannst, dann findest du deinen Fehler vielleicht selbst:

Delphi-Quellcode:
uses
  MSXML2;

const
  NSMY = 'http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-02-09T21:22:41';
  TESTXML = 'DeineTestDaten.xml';

procedure TDemoForm.DemoButtonClick(Sender: TObject);
var
  e: IXMLDOMElement;
begin
  with CoDOMDocument40.Create do
  begin
    async := False;
    setProperty('SelectionNamespaces', Format('xmlns:my="%s"', [NSMY]));
    if Load(TESTXML) then
    begin
      e := selectSingleNode('my:myFields/my:edName') as IXMLDOMElement;
      if Assigned(e)
        then ShowMessage(e.text)
        else ShowMessage('rats!');
    end;
  end;
end;
Zu deinen XPATH-Versuchen: durch den Slash am Anfang wechselst du den context für die expression. Da du das document als context vorgibst (XmlDoc.selectSingleNode...) outet dich der führende Slash höchstens als Mitglied der Hosenträger-und-Gürtel-Fraktion. Garnicht funktionieren kann 'my:edName' - ob mit oder ohne Slash. Funktionieren würde '//my:edName' oder '/*/my:edName'.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.610 Beiträge
 
#3

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n

  Alt 11. Sep 2006, 14:20
Auch diese XPaths funktionieren alle nicht:
  • //my:edName
  • /*/my:edName
  • //my:myFields/my:edName
  • /*/my:myFields/my:edName
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n

  Alt 11. Sep 2006, 14:39
Ich hoffe du hast mich nicht missverstanden: meine Kernaussagen waren erstens, dass ich nicht erkennen kann, was an deinem C#-Code falsch sein könnte und zweitens, dass die beiden ersten XPath-Expressions korrekt waren und bei dir das gleiche Ergebnis liefern müssen. Die von mir angegebenen expressions funktionieren alle - mit meinem Code.

marabu
  Mit Zitat antworten Zitat
Leonard

Registriert seit: 12. Okt 2005
Ort: Lutherstadt Eisleben
64 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n

  Alt 11. Sep 2006, 15:02
Hallo Leute,

als erstes vornweg, so wirklich viel Erfahrung habe ich mit XML auch nicht.
Wenn ich aber eure beiden Beispiele und die InfoPath Daten so vergleiche, dann fällt auf, dass ihr unterschiedliche Namespace Konstanten verwendet.

Versuch doch mal
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-02-09T21:22:41"); anstelle von
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-04-20T16:26:21"); mfg Leonard
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.610 Beiträge
 
#6

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n

  Alt 11. Sep 2006, 15:20
Es war eine Kombination aus beidem:

Code:
            XmlDocument doc = new XmlDocument();
            doc.Load(fileName);

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-02-09T21:22:41");        

            String Name = doc.SelectSingleNode("/*/my:edName", nsmgr).InnerText;
            System.Windows.Forms.MessageBox.Show(Name);
Das funktioniert endlich. *puuuh*

Danke
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz