在加载的对象模型中,使用命名空间为 XmlDocument 元素添加前缀

发布于 2024-08-27 01:39:07 字数 466 浏览 4 评论 0原文

我有一个“普通” XmlDocument 像这样加载:

<root>
    <element1 />
    <element2></element2>
</root>

并希望在对象模型加载之前使用命名空间来限定元素,

<abc:root xmlns:abc="urn:something">
    <abc:element1 />
    <abc:element2></abc:element2>
</abc:root>

然后再将其写出。

I have a "plain" XmlDocument loaded like so:

<root>
    <element1 />
    <element2></element2>
</root>

and want to qualify the elements with namespaces like so while the object model is loaded

<abc:root xmlns:abc="urn:something">
    <abc:element1 />
    <abc:element2></abc:element2>
</abc:root>

before writing it out.

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

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

发布评论

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

评论(2

挽袖吟 2024-09-03 01:39:08

一个肮脏的技巧是,如果您从存储/字符串读取 XML,那么您可以扩展 XmlTextReader 来更改加载的文档的命名空间(尽管我不知道这是否会有帮助,因为您似乎暗示您已经有一个加载的文档,诚然,这肯定是来自某个地方)。

例如:

class MyXmlReader : XmlTextReader
{
    public MyXmlReader(TextReader r) : base(r)
    {
    }

    public override string Prefix
    {
        get
        {
            return "abc";
        }
    }

    public override string NamespaceURI
    {
        get
        {
            return "urn:something";
        }
    }
}

然后您可以像 XmlReader r = new MyXmlReader(new StringReader("")); 或类似的方式使用它。

-= 编辑=-

现在我想有一个更明显的方法,重写 XmlWriter :) 例如

工作

class MyXmlWriter : XmlTextWriter
{
    public MyXmlWriter(TextWriter w)
        : base(w)
    {
    }

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        base.WriteStartElement("abc", localName, "urn-something");
    }
}

完成。

One dirty trick is if you are reading the XML from a store/string then you can extend XmlTextReader to change the loaded document's namespace (although I do not know if is going to be helpful as you seem to imply you already have a loaded document, which admittedly must have come from somewhere).

So for example:

class MyXmlReader : XmlTextReader
{
    public MyXmlReader(TextReader r) : base(r)
    {
    }

    public override string Prefix
    {
        get
        {
            return "abc";
        }
    }

    public override string NamespaceURI
    {
        get
        {
            return "urn:something";
        }
    }
}

Then you can use it like XmlReader r = new MyXmlReader(new StringReader("<root/>")); or similar.

-= EDIT =-

Now I think about it there is a far more obvious way, override the XmlWriter instead :)

e.g.

class MyXmlWriter : XmlTextWriter
{
    public MyXmlWriter(TextWriter w)
        : base(w)
    {
    }

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        base.WriteStartElement("abc", localName, "urn-something");
    }
}

Job done.

时光病人 2024-09-03 01:39:07

不幸的是,您不能只更改节点的命名空间。这些属性是只读的。

您将不得不通过递归或使用 XSLT 创建新文档。

Unfortunately, you can't just change the namespace for a node. Those properties are read-only.

You're going to be stuck creating a new document either by recursion or by using an XSLT.

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