如何将默认命名空间添加到已加载的XmlDocument,以便验证“有效”

时间:2012-02-12 21:31:51

标签: c# xml validation xml-namespaces xmldocument

我们有一些使用某个命名空间的xml数据,但实际上并没有为它声明命名空间。我们想验证它,但是默认命名空间中的无效元素不会被捕获,因为xmlns没有设置,所以xml规则就是这样。在这个处理阶段,文档可能已经加载了很长时间,并且不一定是原始形式(因此名称空间管理器可能是不可能的)。

<root>
   <valid />
   <notvalid />
</root>
var xd = new XmlDocument();
xd.Load(xmlstring);
xd.Validate((sender, args) =>
{
   ...
});

1 个答案:

答案 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,这可能会“更好”。