2009-07-14 2 views
-1

Я пытаюсь использовать XmlReader для анализа файла и установки атрибутов каждого элемента в переменные с помощью reader.GetAttribute ("atrribute_name"), но элементы могут или не могут иметь этот атрибут, поэтому некоторые элементы дают мне ошибку ... Я бы ожидал, что он просто вернет null, когда атрибут отсутствует, но вместо этого он вызывает ошибки.Ошибка проверки правильности DTM XmlReader по атрибуту

Вот полное исключение:

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 

и вот содержание XML:

<?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> 

непрозрачности может или не может присутствовать в каждом слое, наряду с несколькими другими атрибутами.

+0

Пожалуйста, будьте более конкретным - «или что-то в этом роде» просто оставляет нам угадывание. Предоставьте точную ошибку и некоторый код, чтобы мы могли фактически идентифицировать проблему, а не догадываться. Благодарю. –

+0

Stephen, вам нужно будет опубликовать XML, который вы пытаетесь проанализировать, и опубликовать полное исключение (это не «ошибка»). Поймайте исключение, затем опубликуйте ex.ToString(). –

+1

Стивен, вы можете заметить, как мало-помалу, больше информации выходит. Возможно, вам понадобится несколько минут, чтобы опередить этот процесс. Мой следующий вопрос будет о коде, который читает XML (и который устанавливает проверку, которая не работает). После того, как вы опубликуете этот код, займите немного времени, чтобы выяснить, о чем вы не говорите. –

ответ

1

Да. Прочтите документацию для XmlReader. Вы найдете в нем много methods и properties.

В частности, вы найдете Item property, HasAttributes property и AttributeCount property.

+0

Ничего из этого не помогает. Если у меня есть один элемент, который является , и у меня есть другой, который является , у читателя будет тот же счетчик атрибутов. Мне нужен какой-то способ проверить, присутствует ли этот конкретный атрибут, а не сколько присутствуют. –

+0

для (i = 0; i

0

Вы уверены, что, когда у вас есть "attribute_name" в вашем примере, вы всегда передаете действительную строку? Мне кажется, что ваша ошибка может быть связана с тем, что вы передаете значение null в GetAttribute.

+0

Не это. Код сбора атрибутов передается несколько раз, так как существует несколько элементов одного и того же элемента. Первые несколько раз он проходит через штраф, потому что все атрибуты, которые я пытаюсь назначить переменным, присутствуют. Но затем он бросает и ошибается, когда попадает к одному из них, у которого нет этого атрибута. Я не могу использовать AttributeCount, потому что есть несколько атрибутов, и все они являются необязательными, поэтому его невозможно предсказать. –

0

Очевидно, проблема не была связана с xml; GetAttribute() вызывает атрибуты, которые не присутствовали : возвращал null ... но он переходил в float.Parse(), который не работает. Компилятор продолжал говорить мне, что это связано с XmlSchema, поэтому я искал не то место. >.

Эта ошибка была такой болью для отладки.

+0

Да, но это не решает проблему XmlSchemaException, не так ли? –

+0

Да, это действительно так: все, что я сделал, было этим, и это сработало: string tempopacity = reader.GetAttribute ("opacity"); if (tempopacity! = null) {result.Opacity = float.Parse (tempopacity); } –

Смежные вопросы