2009-07-14 11 views
-1

Ich versuche, XmlReader zu verwenden, um eine Datei zu analysieren und die Attribute jedes Elements mithilfe von reader.GetAttribute ("attribute_name") auf Variablen festzulegen, aber die Elemente können dieses Attribut tatsächlich aufweisen oder nicht. Einige Elemente geben mir einen Fehler ... Ich hätte erwartet, dass es nur null zurückgibt, wenn das Attribut nicht vorhanden ist, stattdessen werden Fehler ausgegeben.XmlReader DTD-Validierungsfehler für ein Attribut

Hier ist die vollständige Ausnahme:

System.Xml.Schema.XmlSchemaException: The 'opacity' attribute is not declared. 
    at System.Xml.XmlValidatingReaderImpl.InternalValidationCallback(Object sender, ValidationEventArgs e) 
    at System.Xml.Schema.BaseValidator.SendValidationEvent(XmlSchemaException e, XmlSeverityType severity) 
    at System.Xml.Schema.BaseValidator.SendValidationEvent(XmlSchemaException e) 
    at System.Xml.Schema.DtdValidator.ValidateStartElement() 
    at System.Xml.Schema.DtdValidator.ProcessElement() 
    at System.Xml.Schema.DtdValidator.ValidateElement() 
    at System.Xml.Schema.DtdValidator.Validate() 
    at System.Xml.XmlValidatingReaderImpl.ProcessCoreReaderEvent() 
    at System.Xml.XmlValidatingReaderImpl.Read() 
    at Squared.Tiled.Map.Load(String filename, ContentManager content) in C:\Users\Stephen\Documents\Visual Studio 2008\Projects\Tiled\Tiled.cs:line 650 

und hier ist der XML-Inhalt:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd"> 
<map version="1.0" orientation="orthogonal" width="32" height="32" tilewidth="32" tileheight="32"> 
<tileset name="Untitled" firstgid="1" tilewidth="32" tileheight="32"> 
    <image source="tiles.png"/> 
</tileset> 
<layer name="" width="32" height="32" opacity="0.72"> 
    <data encoding="base64" compression="gzip"> 
    H4sIAAAAAAAAAO3DAQkAAAwEofv+pddjKLhqqqqq6usHHB1pSAAQAAA= 
    </data> 
</layer> 
<layer name="Layer 1" width="32" height="32"> 
    <properties> 
    <property name="layermeta" value="layervalue"/> 
    </properties> 
    <data encoding="base64" compression="gzip"> 
    H4sIAAAAAAAAAO2UUQrAMAhD+7P7X3nsbwydibrJRh6UQloatbZrzbMZI9KZc5g4EB3dx9Lhn8m707+C5cP2ReX+p7ByuK55WlQz1P9u9vZFOkrVJ6pXxR/pM/TcjD+in9e/1vsHXtzV/Cfqn+GJ+2f9u+qfgX3Pf/v/hRBCiLfZAUDgXx4AEAAA 
    </data> 
</layer> 
</map> 

Opazität sein kann in jeder Schicht vorhanden ist oder nicht, zusammen mit einigen anderen Attributen.

+0

Bitte seien Sie genauer - "oder so ähnlich" lässt uns nur raten. Geben Sie den genauen Fehler und einen bestimmten Code an, damit wir das Problem identifizieren und nicht raten können. Vielen Dank. –

+0

Stephen, was Sie tun müssen, ist die XML, die Sie analysieren wollen, zu posten und die vollständige Ausnahme zu posten (es ist kein "Fehler"). Catch die Ausnahme, dann post ex.ToString(). –

+1

Stephen, Sie werden vielleicht merken, wie nach und nach mehr Informationen herauskommen. Vielleicht möchten Sie sich ein paar Minuten Zeit nehmen, um diesem Prozess einen Schritt voraus zu sein. Meine nächste Frage wird über den Code sein, der das XML liest (und das die fehlgeschlagene Validierung einrichtet). Nachdem Sie diesen Code veröffentlicht haben, nehmen Sie sich etwas Zeit, um herauszufinden, was _else_ Sie uns nicht sagen. –

Antwort

1

Ja. Lesen Sie die Dokumentation für XmlReader. Sie finden es viele methods und properties.

Insbesondere finden Sie die Item property, die HasAttributes property und die AttributeCount property.

+0

Nichts davon hilft. Wenn ich ein Element habe, das ist und ich ein anderes habe, das ist, hat der Leser dieselbe Attributanzahl. Was ich brauche, ist eine Möglichkeit zu überprüfen, ob dieses spezifische Attribut vorhanden ist und nicht, wie viele vorhanden sind. –

+0

für (i = 0; i

0

Sind Sie sicher, dass, wo Sie in Ihrem Beispiel "attribute_name" haben, Sie immer eine gültige Zeichenfolge übergeben? Scheint mir, dass Ihr Fehler sein könnte, weil Sie Null an GetAttribute übergeben.

+0

Das ist es nicht. Der Attributsammelcode wird mehrmals durchlaufen, da es mehrere Elemente desselben Elements gibt. Die ersten paar Male passiert es gut, weil alle Attribute, die ich Variablen zuweisen möchte, vorhanden sind. Aber dann wirft es und Fehler, wenn es zu einem von ihnen kommt, der dieses Attribut nicht hat. Ich kann AttributeCount nicht verwenden, da es mehrere Attribute gibt, die alle optional sind und daher nicht vorhergesagt werden können. –

0

Anscheinend war das Problem überhaupt nicht xml bezogen; GetAttribute() ruft Attribute auf, die nicht vorhanden waren waren, die null zurückgaben ... aber es wurde in float.Parse() übergeben, was nicht funktioniert. Der Compiler sagte mir immer, dass es XmlSchema-bezogen sei, also habe ich an den falschen Stellen gesucht. >.>

Dieser Bug war so schwer zu debuggen.

+0

Ja, aber das löst Ihr XmlSchemaException Problem nicht, oder? –

+0

Ja, es tut tatsächlich - alles was ich tat war das, und es funktionierte: string tempopacity = reader.GetAttribute ("opacity"); if (Tempopazität! = null) {result.Opacity = float.Parse (Tempopazität); } –

Verwandte Themen