我定义了一个非常简单的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文件添加到引用中。有人能告诉我哪里出错了吗?
答案 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']")