Laden...

XmlReader überliest Whitespace in mixed Content

Erstellt von Quaneu vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.001 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 3 Jahren
XmlReader überliest Whitespace in mixed Content

Hallo zusammen,

ich versuche gerade eine XML Datei mit dem XmlReader einzulesen. Dabei bin ich über folgendes Problem gestolpert.

Den XmlReader lege ich wie folgt an


XmlReaderSettings xmlReaderSettings = new XmlReaderSettings{IgnoreComments = true, IgnoreProcessingInstructions = true, IgnoreWhitespace = true};
xmlReaderSettings.ValidationType = ValidationType.Schema;
xmlReaderSettings.ValidationEventHandler += validationEventHandler;
using (XmlReader xmlReader = XmlReader.Create(stream, xmlReaderSettings))
{
	return Reader.ReadContent(xmlReader);
}

Das Element das Probleme verursacht sieht im Schema wie folgt aus


<xs:complexType name="ComplexType_2" mixed="true">
	<xs:sequence>
		<xs:element name="ComplexType_2_Property_1" type="xs:string"/>
	</xs:sequence>
</xs:complexType>

Und in der XML wie folgt


	<Property_9>
		text<ComplexType_2_Property_1>ComplexType_2_Property_11</ComplexType_2_Property_1>     
	</Property_9>

Wenn ich nun mit dem Reader dieses Element lesen will bekomme ich nie den Zeilenumbruch und "\t" nach </ComplexType_2_Property_1> obwohl es ja mixed ist. Wenn ich IgnoreWhitespace auf false setze bekomme ich es zwar als Whitespace Node aber nicht als SignificantWhitespace Node. Leider verstehe ich nicht, was ich falsch mache bzw. wo mein Denkfehler liegt.

Der Code zum Lesen sieht wie folgt aus (ist generiert):


public static ComplexType_2_T Read_ComplexType_2_T(XmlReader xmlReader)
{
	var instance = new ComplexType_2_T();
	int position = -1;
	while (xmlReader.Read())
	{
		SkipRead:
		switch (xmlReader.NodeType)
		{
			case XmlNodeType.Element:
				switch (xmlReader.Name)
				{
					case "ComplexType_2_Property_1":
						if (position == 0)
							return instance;
						instance.Add_ComplexType_2_Property_1_P(xmlReader.ReadElementString());
						position = 0;
						goto SkipRead;
					default:
						return instance;
				}

			case XmlNodeType.Text:
				instance.Add_MixedContent(xmlReader.Value);
				break;

			case XmlNodeType.Whitespace:
				break;
			case XmlNodeType.SignificantWhitespace:
				break;
		}
	}

	return instance;
}

Vielen Dank schon mal für die Hinweise

Schöne Grüße
Quaneu

4.939 Beiträge seit 2008
vor 3 Jahren

Mixed bedeutet ja nur, daß innerhalb Attribute, Elemente und Text enthalten sein können. Und bei IgnoreWhitespace = true wird selbstverständlich jedes Whitespace überlesen.

Und bzgl. IgnoreWhitespace = false, lies mal XmlDocument: whitespace handling and normalization.
Es scheint also, trotz Dokumentation XmlNodeType

SignificantWhitespace 14 White space between markup in a mixed content model or white space within the xml:space="preserve" scope.

nicht konsistent umgesetzt zu sein.

Laut Handling White Space with XmlTextReader kann wohl nur innerhalb von xml:space="preserve" SignificantWhitespace zurückgeliefert werden.

Edit: Wie wird denn Whitespace innerhalb behandelt?


<Property_9>
        text text2
        text3 <ComplexType_2_Property_1>ComplexType_2_Property_11</ComplexType_2_Property_1>
</Property_9>

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 3 Jahren

In der Doku zu Ignorewhitespace steht folgendes

Leerraum, der nicht als signifikant betrachtet wird, umfasst Leerzeichen, Tabstopps und leere Zeilen, mit denen das Markup für eine bessere Lesbarkeit festgelegt wird. Ein Beispiel hierfür ist Leerraum im Element Inhalt.

Diese Eigenschafts Einstellung wirkt sich nicht auf Leerraum zwischen Markup in einem gemischten Inhalts Modus oder Leerraum aus, der innerhalb des Gültigkeits Bereichs eines xml:space='preserve' Attributs auftritt.

Daher dachte ich ich kann es auf true lassen.

Selbst wenn ich im Schema folgendes schreibe


<xs:element name="Property_9" type="ComplexType_2" xml:space="preserve"/>

Bekomme ich nur bei Ignorewhitespace = false einen Whitespace Node.

Dies widerspricht sich doch mit der Dokumentation, oder?

Edit: Zu deiner Frage:
Also ich bekomme folgendes:
"
text text2
text3 "

als Text und der Rest verhält sich wie bei meinem Beispiel.

4.939 Beiträge seit 2008
vor 3 Jahren

Ja, das meinte ich ja damit, daß die Doku nicht zur Implementierung paßt (bzw. umgekehrt).

Und müßte xml:space="preserve" nicht innerhalb der XML-Datei stehen?

Du erhältst also Whitespace innerhalb des Text-Node? WhitespaceHandling steht bei dir aber auf All (default)?

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 3 Jahren

Und müßte xml:space="preserve" nicht innerhalb der XML-Datei stehen?

Du hast vollkommen recht... sorry. Damit bekomme ich dann auch IgnoreWhitespace = true einen SignificantWhitespace Node. Jetzt passt auch wieder alles.

Du erhältst also Whitespace innerhalb des Text-Node?

Ja die bekomme ich.

WhitesapceHandling steht bei dir aber auf All (default)?

Also ich setzte nichts. Ich benutze ja XmlReader.Create mit den Settings.

Vielen vielen Dank für deine Hilfe 👍