我们有一些使用某个命名空间的xml数据,但实际上并没有为它声明命名空间。我们想验证它,但是默认命名空间中的无效元素不会被捕获,因为xmlns
没有设置,所以xml规则就是这样。在这个处理阶段,文档可能已经加载了很长时间,并且不一定是原始形式(因此名称空间管理器可能是不可能的)。
<root>
<valid />
<notvalid />
</root>
var xd = new XmlDocument();
xd.Load(xmlstring);
xd.Validate((sender, args) =>
{
...
});
答案 0 :(得分:5)
您无法动态修改XmlDocument,因为已经使用特定命名空间创建了XmlNodes。您必须修改文档并通过XmlNodeReader重新解析/重读。 您可以在XmlDocument上设置属性,但对于命名空间,只有在重新加载文档(来自修改后的副本)后,它们才会实际执行任何操作。
var target = "urn:foobar";
var xd = new XmlDocument();
xd.Load(xmlstring);
// set default namespace to a schema identifier,
// this is not enforced in this 'xd' document yet.
xd.DocumentElement.SetAttribute("xmlns", target);
var newXd = new XmlDocument();
// reload document into new instance
newXd.Load(xd.OuterXml);
// attach the schema URI to schema identifier
newXd.Schemas.Add(target, "file:///c|/temp/foobar.xsd");
newXd.Validate((sender, args) => {
... // now elements in default namespace are validated against "foobar.xsd"
});
使用XmlNodeReader,LAAEFTR,这可能会“更好”。