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

发布于 2025-01-04 11:52:17 字数 386 浏览 0 评论 0原文

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

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

We have some xml data that uses a certain namespace, but does not actually declare a namespace for it. We want to validate it, but invalid elements in default namespace don't get caught because xmlns is not set so by xml rules anything goes. At this stage of processing document has possibly been loaded for a long time, and is not necessarily in original form anyways (so namespace manager is probably out of the question).

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

天荒地未老 2025-01-11 11:52:17

您无法即时修改 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 可能会“更好”地完成此操作。

You can't modify XmlDocument on the fly, because XmlNodes are already created with a certain namespace. You have to modify the document and reparse it/reread via XmlNodeReader.
You can set attributes on XmlDocument, but for namespace they'll actually enforce anything only after reload of document (from modified copy).

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"
});

This probably would be "better" done with XmlNodeReader, LAAEFTR.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文