Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   C# [XML] XPath in XML-Dokument (mit XML-Namespace) greift nicht (https://www.delphipraxis.net/76853-%5Bxml%5D-xpath-xml-dokument-mit-xml-namespace-greift-nicht.html)

Phoenix 11. Sep 2006 08:28


[XML] XPath in XML-Dokument (mit XML-Namespace) greift nicht
 
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.

marabu 11. Sep 2006 14:04

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n
 
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

Phoenix 11. Sep 2006 14:20

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n
 
Auch diese XPaths funktionieren alle nicht:
  • //my:edName
  • /*/my:edName
  • //my:myFields/my:edName
  • /*/my:myFields/my:edName

marabu 11. Sep 2006 14:39

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n
 
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

Leonard 11. Sep 2006 15:02

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n
 
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
Delphi-Quellcode:
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-02-09T21:22:41");
anstelle von
Delphi-Quellcode:
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-04-20T16:26:21");
mfg Leonard

Phoenix 11. Sep 2006 15:20

Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n
 
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 :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 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