![]() |
[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:
(Ja, das ist für ne Mini-Zeiterfassung :) ).
<?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> Jedenfalls will ich in nun die mit Infopath erstellten XML-Files mit einem eigenen Programm auswerten. Dazu benutze ich stand jetzt folgenden Code:
Code:
In Filename steht die Adresse zu einem entsprechenden File, das öffnen etc. tut auch.
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); } 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: ![]() Und hier der normale XPath-Eintrag: ![]() 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:
Aso.. Nachtrag: Ich benutze freilich .NET 2.0. |
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:
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'.
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; Grüße vom marabu |
Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n
Auch diese XPaths funktionieren alle nicht:
|
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 |
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:
anstelle von
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-02-09T21:22:41");
Delphi-Quellcode:
mfg Leonard
nsManager.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-04-20T16:26:21");
|
Re: [XML] XPath in XML-Dokument (mit XML-Namespace) greift n
Es war eine Kombination aus beidem:
Code:
Das funktioniert endlich. *puuuh*
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); Danke :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz