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>
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
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
-> Informatik-Infotainment <-
Rein aus Interesse:
Hat einer der hier genannten Vorschläge geholfen?
Gruß,
Jack
-> Informatik-Infotainment <-
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.
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).
Grüße,
Andre
P.S.: es gibt natürlich 3rd Party Bibliotheken, die XPath 2 unterstützen, etwa XQSharp