无法在C#项目中使用引用的XML模式文件(xsd)

时间:2013-12-16 14:08:13

标签: c# xml xsd getelementbyid

我定义了一个非常简单的XML模式,名为MySchema,我将其添加到项目的引用中:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="MySchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="UserList">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="User" type="xs:string" minOccurs="0" maxOccurs="unbounded">
        </xs:element>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID" use="required"/>
    </xs:complexType>
  </xs:element>

</xs:schema>

我可以使用XmlDocument.GetElementById

我的示例XML文件是

<?xml version="1.0" encoding="UTF-8"?><UserList id="local"/>

但是,当我运行GetElementById("local")时,我仍然会收到“NullReferenceException”。

我想我需要做的不仅仅是将xsd文件添加到引用中。有人能告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分:1)

如果您没有定义DTD或XSD来定义id是什么,则GetElementById方法不起作用。

如果您在未显示的代码中定义XSD或DTD,请更新您的问题。

DOM实现必须具有定义哪些属性属于ID类型的信息。虽然可以在XSD架构或DTD中定义类型ID的属性,但此版本的产品仅支持在DTD中定义的那些。除非在DTD中定义,否则名称为“ID”的属性不是ID类型。不知道属性是否为ID类型的实现应该返回Nothing。

http://www.xtremevbtalk.com/showthread.php?t=313101

根据帖子顶部的XSD,我会说你没有将xsd加载到XmlDocument实例中,以便它知道哪个是xs:id

答案 1 :(得分:1)

看起来XmlDocument.GetElementById不支持在XSD架构中定义的ID属性,只支持DTD:

  

DOM实现必须具有定义哪些属性属于ID类型的信息。虽然可以在XSD架构或DTD中定义类型ID的属性,但此版本的产品仅支持在DTD中定义的那些。除非在DTD中定义,否则名称为“ID”的属性不是ID类型。不知道属性是否为ID类型的实现应该返回null。

您可以将SelectSingleNode与传统的XPath一起使用,但是:

doc.DocumentElement.SelectSingleNode("//UserList[@id='local']")