Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 14.02.07 12:40 
Hallo,

Ich habe folgendes XML-Dokument, aus dem ich Daten ziehen muss:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
<?xml version="1.0" encoding="utf-8"?>
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:UrlaubsantrTge:-myXSD-2007-02-08T14-19-55" solutionVersion="1.0.0.23" productVersion="12.0.0.0" PIVersion="1.0.0.0" href="http://server/verwaltung/Urlaubsantrge/Forms/template.xsn"?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
<my:meineFelder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-02-08T14:19:55" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="de-DE">
  <my:Planung>
    <my:Einzeldaten>
      <my:vonDatum>2007-04-03</my:vonDatum>
      <my:bisDatum>2007-04-26</my:bisDatum>
      <my:dauer>15</my:dauer>
    </my:Einzeldaten>
    <my:antragsSumme>15</my:antragsSumme>
  </my:Planung>
  <my:anspruch>28.0000000000000</my:anspruch>
  <my:resturlaub>5.00000000000000</my:resturlaub>
  <my:anspruchGesamt>33</my:anspruchGesamt>
  <my:name>Uwe Grohne</my:name>
  <my:restAnspruch>18</my:restAnspruch>
  <my:vertreter>Uwe Grohne</my:vertreter>
  <my:vorgesetzter>Uwe Grohne</my:vorgesetzter>
  <my:personalAbteilung>Uwe Grohne</my:personalAbteilung>
</my:meineFelder>

Ich wollte erstmal mit den einzelnen Nodes unten anfangen, also vertreter, vorgesetzter und personalAbteilung und dachte mir, ich mache das einfach per XPath, da ich das nachher auch für die Einzeldaten der Planung verwenden möchte.

Dazu verwende ich folgenden Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        XmlDocument myDoc = new XmlDocument();
            myDoc.Load(myStream);

            // Felder auslesen
            XmlNode node = myDoc.SelectSingleNode("//my:vertreter");
            this.vertreter = new string[1];
            this.vertreter[0] = node.FirstChild.Value;
            node = myDoc.SelectSingleNode("//my:vorgesetzter");
            this.vorgesetzter = node.FirstChild.Value;
            node = myDoc.SelectSingleNode("//my:personalAbteilung");
            this.personalAbteilung = node.FirstChild.Value;

Dummerweise bekomme ich da folgenden Fehler vorgesetzt:
Zitat:
System.Xml.XPath.XPathException: Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.

Wie verwende ich jetzt den Namespace Manager oder XsltContext.

Problem ist: Die ganze Zeit Rumprobieren dauert Ewigkeiten, weil ich bisher jedesmal Kompilieren, auf den Server kopieren, in den GAC installieren und IIS neu starten muss. Daher wäre ein wenig Code und Erklärung, was hier das Problem genau ist, sehr hilfreich ;)
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 14.02.07 14:09 
OK, habs herausgefunden. Man muss mit dem Namespace-Manager arbeiten, um das "my" per XPath "auflösen" zu können. Dazu muss der entsprechende Namespace hinzugefügt werden:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(myDoc.NameTable);
            nsmgr.AddNamespace("my""http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-02-08T14:19:55");
            XmlNode node = myDoc.SelectSingleNode("//my:vertreter",nsmgr);
            this.vertreter = new string[1];
            this.vertreter[0] = node.FirstChild.Value;
            node = myDoc.SelectSingleNode("//my:vorgesetzter",nsmgr);
            this.vorgesetzter = node.FirstChild.Value;
            node = myDoc.SelectSingleNode("//my:personalAbteilung",nsmgr);
            this.personalAbteilung = node.FirstChild.Value;