2009-07-14 6 views
-1

XmlReader를 사용하여 파일을 구문 분석하고 각 요소의 특성을 reader.GetAttribute ("atrribute_name")을 사용하여 변수로 설정하려고했지만 요소에 실제로 해당 특성이 있거나 없을 수 있습니다. 그래서 일부 요소는 내게 오류를 준다 ... 나는 속성이 존재하지 않을 때 null을 반환 할 것이라고 예상했을 것이다. 대신에 오류를 던진다.XmlReader 특성의 DTD 유효성 검사 오류

여기에 전체 예외입니다 :

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에 대한 설명서를 읽으십시오. 너는 많은 methodsproperties을 찾을 것이다.

특히, Item property, HasAttributes propertyAttributeCount property이 있습니다.

+0

그게 도움이되지 않습니다. 이고 요소 인 다른 요소가있는 경우 독자는 동일한 속성 수를 갖게됩니다. 내가 필요한 것은 특정 속성이 존재 하는지를 검사하는 방법이며 얼마나 많은 것이 존재 하는지를 검사하는 것이다. –

+0

for (i = 0; i

0

예제에서 "attribute_name"은 항상 유효한 문자열을 전달하고 있습니까? GetAttribute에 null을 전달하기 때문에 오류가 발생할 수 있습니다.

+0

그건 아니야. 속성 수집 코드는 동일한 요소가 여러 개 있기 때문에 여러 번 전달됩니다. 변수에 할당하려고하는 모든 속성이 있기 때문에 처음 몇 번 제대로 전달됩니다. 그러나 그 속성을 가지고 있지 않은 사람 중 한 사람에게 도착하면 오류가 발생하고 오류가 발생합니다. AttributeCount를 사용할 수없는 이유는 여러 속성이 있고 모두 선택적이므로 예측할 수 없기 때문입니다. –

0

명백하게 문제는 xml과 전혀 관련이 없었습니다. 에없는 속성에 대한 GetAttribute() 호출은 null을 반환하는 이었지만 작동하지 않는 float.Parse()로 전달되었습니다. 컴파일러는 계속 XmlSchema와 관련 있다고 말하면서 잘못된 위치를 찾고있었습니다. >.>

버그는 디버깅하는 데 큰 고통이었습니다.

+0

그래,하지만 XmlSchemaException 문제가 해결되지 않습니까? –

+0

예, 실제로는 - 제가 한 것은 이것뿐이었습니다. 문자열 tempopacity = reader.GetAttribute ("opacity"); if (tempopacity! = null) {result.Opacity = float.Parse (tempopacity); } –