将字符串解析为XElement时,如何为其添加指定命名空间?
嘿,这个问题很常见,我来给你捋清楚怎么实现。当你已经把字符串解析成XElement之后,要给它设置指定命名空间,核心是修改元素的Name属性——因为XElement的名称是包含命名空间的XName类型,我们只需要替换掉它的命名空间部分就行。
下面分两种常见场景给你具体代码实现:
方法1:仅给根节点添加命名空间
如果你的需求只是让根节点<ReferResult>带上目标命名空间,子元素保持无命名空间,那直接修改根节点的Name属性就可以:
string Namespace = "http://mynamespace"; string defaultXml = "<ReferResult><Text> Testing Referred</Text></ReferResult>"; XElement myXml = XElement.Parse(defaultXml); // 修改根节点的命名空间 myXml.Name = XName.Get(myXml.Name.LocalName, Namespace); // 输出验证结果 Console.WriteLine(myXml.ToString());
输出结果会是:
<ReferResult xmlns="http://mynamespace"> <Text> Testing Referred</Text> </ReferResult>
方法2:给所有元素统一添加命名空间
如果希望整个XML树的所有元素(包括子元素<Text>)都使用同一个命名空间,那需要写一个递归方法遍历所有节点,逐个修改它们的Name:
string Namespace = "http://mynamespace"; string defaultXml = "<ReferResult><Text> Testing Referred</Text></ReferResult>"; XElement myXml = XElement.Parse(defaultXml); // 调用递归方法给所有元素设置命名空间 SetNamespaceRecursively(myXml, Namespace); // 递归修改元素命名空间的辅助方法 static void SetNamespaceRecursively(XElement element, XNamespace targetNs) { // 修改当前元素的命名空间 element.Name = targetNs + element.Name.LocalName; // 遍历所有子元素,递归处理 foreach (var childElement in element.Elements()) { SetNamespaceRecursively(childElement, targetNs); } } // 输出验证结果 Console.WriteLine(myXml.ToString());
这次的输出会是所有元素都带上目标命名空间:
<ReferResult xmlns="http://mynamespace"> <Text xmlns="http://mynamespace"> Testing Referred</Text> </ReferResult>
额外小提示
如果你的原始XML字符串本身没有命名空间声明,没办法在XElement.Parse()的时候直接指定命名空间——Parse方法会严格按照输入的XML结构解析。所以修改已解析完成的XElement是最直接的解决方案。
内容的提问来源于stack exchange,提问作者rohit singh




