【问题标题】:XmlReader DTD Validation Error on an Attribute属性上的 XmlReader DTD 验证错误
【发布时间】:2009-07-14 20:36:54
【问题描述】:

我正在尝试使用 XmlReader 解析文件并使用 reader.GetAttribute("atrribute_name") 将每个元素的属性设置为变量,但元素可能实际存在也可能不存在该属性,因此某些元素会给我一个错误...我原以为它只会在属性不存在时返回 null ,但它会引发错误。

这是完整的例外:

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>

每层中可能存在也可能不存在不透明度以及其他几个属性。

【问题讨论】:

  • 请说得更具体一些——“或类似的东西”只会让我们猜测。提供确切的错误和一些代码,以便我们可以实际识别问题而不是猜测。谢谢。
  • Stephen,您需要做的是发布您尝试解析的 XML,然后发布完整的异常(这不是“错误”)。捕获异常,然后发布 ex.ToString()。
  • Stephen,您可能会注意到越来越多的信息正在逐渐浮出水面。您可能需要花几分钟时间来提前完成该过程。我的下一个问题是关于读取 XML 的代码(以及设置失败的验证)。发布该代码后,花点时间弄清楚您没有告诉我们的else
  • 一件可能无关紧要的小事 - 尝试为第一层指定一个非空名称。
  • 什么都不做。在尝试 HasAttributes 之前,如果我注释掉这行 Opacity = st.GetAttribute("opacity");

标签: c# xml dtd xmlreader


【解决方案1】:

是的。阅读XmlReader 的文档。你会发现它有很多methodsproperties

特别是,您会发现Item propertyHasAttributes propertyAttributeCount property

【讨论】:

  • 这些都没有帮助。如果我有一个元素是 而我有另一个元素是 ,那么阅读器将具有相同的属性计数。我需要的是某种方法来检查该特定属性是否存在,而不是存在多少。
  • for (i=0;i
【解决方案2】:

您确定在您的示例中有“attribute_name”的地方总是传递一个有效的字符串吗?在我看来,您的错误可能是因为您将 null 传递给 GetAttribute。

【讨论】:

  • 不是这样的。属性收集代码被传递了几次,因为有几个相同的元素。前几次它通过了很好,因为我试图分配给变量的所有属性都存在。但是,当它到达其中一个没有该属性的地方时,它会抛出错误。无法使用AttributeCount,因为有几个属性,而且都是可选的,所以无法预测。
【解决方案3】:

显然这个问题根本与 xml 无关;对不存在的属性的 GetAttribute() 调用 返回 null...但它正在传递给 float.Parse(),这不起作用。编译器一直告诉我它与 XmlSchema 相关,所以我找错了地方。 >.>

那个 bug 调试起来太痛苦了。

【讨论】:

  • 是的,但这并不能解决您的 XmlSchemaException 问题,是吗?
  • 是的,它确实如此——我所做的就是这样,它奏效了:string tempopacity = reader.GetAttribute("opacity"); if (tempopacity != null) { result.Opacity = float.Parse(tempopacity); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多