如何移除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
相关产品推荐
相关产品推荐

