使用XmlWriter和XmlWriter命名空间编写XElement

本文关键字:XmlWriter XElement 命名空间 使用 | 更新日期: 2023-09-27 18:02:29

我有一个XmlWriter,它已经有一个具有xmlns属性集的根元素。

我现在有一个XElement(有很多子元素),没有指定命名空间。

如果我只是做:

    xElement.WriteTo(writer);

我以一个无效的xml结尾:

<MyRootElement xmlns="SomeNameSpace">
    <!-- Some elements of this namespace -->
    <MyXElementType  xmlns="">
        <!-- A lot of other Element in the same namespace -->
    </MyXelementType>
    <!-- Some elements of this namespace -->
</MyRootElement>

因为禁止指定空命名空间。这是有问题的,因为我需要在XSD之后进行验证。

我该怎么做才能结束这个:

    <MyXElementType><!-- HERE, no xmlns !!! -->
        <!-- A lot of other Element in the same namespace -->
    </MyXelementType>
    <!-- Some elements of this namespace -->
</MyRootElement>

使用XmlWriter和XmlWriter命名空间编写XElement

你凭什么认为它无效?规范说:

默认命名空间声明中的属性值可以为空。在声明的范围内,这与没有默认命名空间具有相同的效果。

如果要删除它,则需要在写入XElement及其后代元素之前将其名称空间设置为与现有根元素相同的名称空间。您可以在创建它时这样做:

XNamespace ns = "SomeNamespace";
var element = new XElement(ns + "MyXElementType");

或者事后:

foreach (var element in element.DescendantsAndSelf())
{
    element.Name = ns + element.Name.LocalName;
}