You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除XML元素的xmlns,或创建时避免自动添加空xmlns?

问题

需要生成如下结构的XML:

<trajectorys xmlns="http://www.witsml.org/schemas/1series" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.4.1.1">
  <trajectory uidWell="b213fb5d-d203-41e3-8d03-64d71d5d19c2" uidWellbore="c8ede8d3-7838-4287-aad2-3da717150dff" uid="31EXX40">
  </trajectory>
</trajectorys>

现有C#代码如下:

var xDoc = new XDocument();
XNamespace ns1 = "http://www.witsml.org/schemas/1series";
XNamespace ns2 = "http://www.w3.org/2001/XMLSchema-instance";
var root = new XElement(ns1 + "trajectorys",
    new XAttribute("xmlns", "http://www.witsml.org/schemas/1series"),
    new XAttribute(XNamespace.Xmlns.GetName("xsi"), "http://www.w3.org/2001/XMLSchema-instance"),
    new XAttribute("version", "1.4.1.1"));

xDoc.Add(root);

var trajectory = new XElement("trajectory",
    new XAttribute("uidWell", "b213fb5d-d203-41e3-8d03-64d71d5d19c2"),
    new XAttribute("uidWellbore", "c8ede8d3-7838-4287-aad2-3da717150dff"),
    new XAttribute("uid", "31EXX40"));

trajectory.Name = trajectory.Name.LocalName;    // 尝试移除xmlns
root.Add(trajectory);

运行后生成的XML自动给<trajectory>添加了空的xmlns=""属性,导致其他程序无法正常读取:

<trajectorys xmlns="http://www.witsml.org/schemas/1series" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.4.1.1">
  <trajectory uidWell="b213fb5d-d203-41e3-8d03-64d71d5d19c2" uidWellbore="c8ede8d3-7838-4287-aad2-3da717150dff" uid="31EXX40" xmlns="">
  </trajectory>
</trajectorys>
解决方案

问题根源是<trajectory>元素未继承根节点的命名空间,LINQ to XML会自动添加空命名空间属性来明确它属于无命名空间范围。直接给<trajectory>指定根节点的命名空间即可解决:

修改后的代码:

var xDoc = new XDocument();
XNamespace ns1 = "http://www.witsml.org/schemas/1series";
XNamespace ns2 = "http://www.w3.org/2001/XMLSchema-instance";
var root = new XElement(ns1 + "trajectorys",
    new XAttribute(XNamespace.Xmlns.GetName("xsi"), "http://www.w3.org/2001/XMLSchema-instance"),
    new XAttribute("version", "1.4.1.1"));

xDoc.Add(root);

// 直接使用根节点的命名空间创建trajectory元素
var trajectory = new XElement(ns1 + "trajectory",
    new XAttribute("uidWell", "b213fb5d-d203-41e3-8d03-64d71d5d19c2"),
    new XAttribute("uidWellbore", "c8ede8d3-7838-4287-aad2-3da717150dff"),
    new XAttribute("uid", "31EXX40"));

root.Add(trajectory);

额外说明:创建根节点时无需手动添加xmlns属性——用ns1 + "trajectorys"创建元素时,LINQ to XML会自动生成默认命名空间声明,手动添加属于冗余操作,可以去掉以保持代码简洁。

修改后生成的XML将符合预期,不会出现空的xmlns属性。

内容的提问来源于stack exchange,提问作者spainchaud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:27:42