【问题标题】:How to add default namespace to loaded XmlDocument so that validation "works"如何将默认命名空间添加到加载的 XmlDocument 以便验证“有效”
【发布时间】:2012-03-04 09:40:45
【问题描述】:

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

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

【问题讨论】:

    标签: c# xml validation xml-namespaces xmldocument


    【解决方案1】:

    您不能即时修改 XmlDocument,因为 XmlNode 已经使用特定命名空间创建。您必须修改文档并通过 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 可能会“更好”。

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 2011-07-18
      • 2014-01-06
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2013-03-02
      相关资源
      最近更新 更多