Laden...

Komme nicht ans XML-Node

Erstellt von hrmc vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.454 Views
H
hrmc Themenstarter:in
15 Beiträge seit 2010
vor 13 Jahren
Komme nicht ans XML-Node

verwendetes Datenbanksystem: XML

Hallo miteinander,

ich habe hier eine XML-Datei komme aber nicht an den gesuchten Knoten ran.

Ich habs so versucht:

 mattext = xmlDoc.DocumentElement.SelectSingleNode("item/material/mattext").InnerText;                    
 Console.WriteLine("XML TYPE = QTI ====" + xmlDoc.DocumentElement.Name);

Aber auch schon mit item/presentation/material/mattext

Ich will an diesen ersten mattext mit dem CDATA Tag rankommen

Vielen Dank!

XML-Code


<?xml version="1.0" encoding="UTF-8"?>
<questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2">
  <item label="101" ident="1_5_a565b8da-a305-463f-92d2-7d7be201bd24" maxattempts="3" title="Choice page">
    <presentation label="Choice-Question">
      <material>
        <mattext><![CDATA[Which of these countries border Germany?<br>]]></mattext>
        <mataudio uri="1_5_a565b8da-a305-463f-92d2-7d7be201bd24_01.mp3"/>
      </material>
      <response_lid ident="a565b8da-a305-463f-92d2-7d7be201bd24" rtiming="No" rcardinality="Multiple">
        <render_choice shuffle="No">
          <response_label ident="#1">
            <material>
              <mattext>France</mattext>
            </material>
          </response_label>
          <response_label ident="#2">
            <material>
              <mattext>Denmark</mattext>
            </material>
          </response_label>
          <response_label ident="#3">
            <material>
              <mattext>Poland</mattext>
            </material>
          </response_label>
          <response_label ident="#4">
            <material>
              <mattext>Czech Republic</mattext>
            </material>
          </response_label>
          <response_label ident="#5">
            <material>
              <mattext>Austria</mattext>
            </material>
          </response_label>
          <response_label ident="#6">
            <material>
              <mattext>Switzerland</mattext>
            </material>
          </response_label>
          <response_label ident="#7">
            <material>
              <mattext>Luxembourg</mattext>
            </material>
          </response_label>
          <response_label ident="#8">
            <material>
              <mattext>Greece</mattext>
            </material>
          </response_label>
        </render_choice>
      </response_lid>
    </presentation>
    <resprocessing>
      <outcomes>
        <decvar/>
      </outcomes>
      <respcondition title="correct">
        <conditionvar>
          <and>
            <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#1</varequal>
            <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#2</varequal>
            <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#3</varequal>
            <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#4</varequal>
            <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#5</varequal>
            <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#6</varequal>
            <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#7</varequal>
          </and>
        </conditionvar>
        <setvar varname="Score" action="Set">1</setvar>
        <displayfeedback feedbacktype="Response" linkrefid="correct"/>
      </respcondition>
      <respcondition title="Teilweise">
        <conditionvar>
          <and>
            <or>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#1</varequal>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#2</varequal>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#3</varequal>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#4</varequal>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#5</varequal>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#6</varequal>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#7</varequal>
            </or>
            <not>
              <and>
                <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#1</varequal>
                <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#2</varequal>
                <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#3</varequal>
                <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#4</varequal>
                <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#5</varequal>
                <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#6</varequal>
                <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#7</varequal>
                <not>
                  <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#8</varequal>
                </not>
              </and>
            </not>
          </and>
        </conditionvar>
        <displayfeedback feedbacktype="Response" linkrefid="teilweise"/>
      </respcondition>
      <respcondition title="wrong">
        <conditionvar>
          <and>
            <not>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#1</varequal>
            </not>
            <not>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#2</varequal>
            </not>
            <not>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#3</varequal>
            </not>
            <not>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#4</varequal>
            </not>
            <not>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#5</varequal>
            </not>
            <not>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#6</varequal>
            </not>
            <not>
              <varequal respident="a565b8da-a305-463f-92d2-7d7be201bd24">#7</varequal>
            </not>
          </and>
        </conditionvar>
        <displayfeedback feedbacktype="Response" linkrefid="wrong"/>
      </respcondition>
    </resprocessing>
    <itemfeedback ident="correct" view="Candidate">
      <material>
        <mattext>Correct!</mattext>
      </material>
    </itemfeedback>
    <itemfeedback ident="teilweise" view="Candidate">
      <material>
        <mattext>Wrong!</mattext>
      </material>
    </itemfeedback>
    <itemfeedback ident="wrong" view="Candidate">
      <material>
        <mattext>Wrong!</mattext>
      </material>
    </itemfeedback>
  </item>
</questestinterop>

1.373 Beiträge seit 2004
vor 13 Jahren

Hi,

Du vergisst, dass deine Elemente einen Namespace verwenden. Folgendes sollte gehen:


var ns = new XmlNamespaceManager(xmldoc.NameTable);
ns.AddNamespace("x", "http://www.imsglobal.org/xsd/ims_qtiasiv1p2");
var mattext = xmldoc.DocumentElement.SelectSingleNode("x:item/x:presentation/x:material/x:mattext", ns).InnerText;

Übrigens fehlt beim CDATA Block der besagten Node ein Ausrufezeichen, also: <![CDATA[ ... ]]>

Grüße,
Andre

H
hrmc Themenstarter:in
15 Beiträge seit 2010
vor 13 Jahren

Vielen Dank!

J
193 Beiträge seit 2007
vor 13 Jahren

Hallo hrmc,

ich beschäftige mich zwar erst seit einigen Tagen mit XPath, aber ich glaube dein XPath-Ausdruck ist falsch.

Statt "item/material/mattext" wäre (glaube ich zumindest) "//item/presentation/material/mattext" korrekt.

Vielleicht lag es ja daran...

Gruß,
Jack

H
hrmc Themenstarter:in
15 Beiträge seit 2010
vor 13 Jahren

//nichts 😉

J
193 Beiträge seit 2007
vor 13 Jahren

Rein aus Interesse:

Hat einer der hier genannten Vorschläge geholfen?

Gruß,
Jack

F
60 Beiträge seit 2010
vor 13 Jahren

Es liegt sicher am namespacemanager und die hier gezeigte lösung müsste funktionieren. Allerdings wärs komfortabler wenn man den defaultnamespace auch dem namespacemanager als default bekannt macht (präfix string.empty), dann spart man sich die präfixe im xpath ausdruck (welche ich gerne vergesse und dann doof schau).

Je nachdem, welcher Knoten aktuell der Kontextknoten ist, kann der xpath ausdruck stimmen oder auch nicht. Deiner ist auf jeden fall auch richtig, wobei du dir den doppelslash sparen kannst.

passen würde unter anderem (Kontext root):


//item/presentation/material/mattext
/questestinterop/item/presentation/material/mattext
//presentation/material/mattext
/*/presentation/material/mattext

Gut zum testen ist immer der xpath visualizer.

1.373 Beiträge seit 2004
vor 13 Jahren

Hi,

Man kann zwar einen default namespace im XmlNamespaceManager definieren, dieser findet aber bei Select* keine Beachtung, da XPath 1.0 das schlichtweg nicht unterstützt (und die FCL wiederum nur XPath 1.0 unterstützt).

http://connect.microsoft.com/VisualStudio/feedback/details/277186/xmlnamespacemanager-and-undefinedxsltcontext-dont-handle-default-namespace

Grüße,
Andre

P.S.: es gibt natürlich 3rd Party Bibliotheken, die XPath 2 unterstützen, etwa XQSharp