C#:如何从 XElement 中获取名称(带前缀)作为字符串?

Posted

技术标签:

【中文标题】C#:如何从 XElement 中获取名称(带前缀)作为字符串?【英文标题】:C#: How to get the name (with prefix) from XElement as string? 【发布时间】:2011-09-17 06:43:30 【问题描述】:

这可能是重复的,因为我的问题似乎很琐碎,但我无法在 ***.com 上找到答案。

我有一个 XElement,其数据如下:

<abc:MyElement>My value</abc:MyElement>

问题: 如何从 XElement 中获取带有前缀的完整名称作为字符串?

预期结果

abc:MyElement

【问题讨论】:

【参考方案1】:

到目前为止,我的解决方案是使用XElement 中提供的方法GetPrefixOfNamespace

虽然不是一个很好的解决方案,但它给了我想要的:

XElement xml = new XElement(...);
string nameWithPrefix = xml.GetPrefixOfNamespace(xml.Name.Namespace) + 
                        ":" + 
                        xml.Name.LocalName;

非常欢迎更优雅的解决方案:)

【讨论】:

【参考方案2】:

正确,我没有使用与您相同的对象。使用 LINQ 命名空间,您的解决方案是:

using System.Xml.XPath; // <-- Add this namespace.

XNamespace ci = "http://foo.com";
XElement root = new XElement(ci + "Root", new XAttribute(XNamespace.Xmlns + "abc", "http://foo.com"));
XElement childElement = new XElement(ci + "MyElement", "content");
root.Add(childElement);
var str = childElement.XPathEvaluate("name()"); // <-- Tell Xpath to do the work for you :).
Console.WriteLine(str);

打印

abc:MyElement

【讨论】:

看起来不错,如果我使用的是XmlElement。但是由于我使用的是XElement,所以它不起作用:)【参考方案3】:
XNamespace ci = "http://foo.com";
XElement myElement = new XElement(ci + "MyElement", "MyValue");
XElement rootElement = new XElement("root",
        new XAttribute(XNamespace.Xmlns + "abc", ci), myElement);

var str = myElement.ToString();
Console.WriteLine(str);

打印

<abc:MyElement xmlns:abc="http://foo.com">MyValue</abc:MyElement>

【讨论】:

我试图让我的问题更清楚。我只想要前缀和元素名称 (abc:MyElement) - 而不是带有命名空间和值的整个元素。【参考方案4】:

string.Format("0:1", XElement.Prefix, XElement.Name) 不工作吗?

【讨论】:

我在XElement 上没有任何属性Prefix。如果我有的话,那将是一个非常好的解决方案:) 您使用的是哪个版本的框架? MSDN 表明它具有该属性。 你能告诉我更近一点吗?我找不到属性/方法Prefix。我可以找到public string GetPrefixOfNamespace(XNamespace ns) 的方法,到目前为止我已经使用那个方法给我前缀。 你是对的。我不知道为什么我认为它在那里......你的解决方案对我来说似乎是最好的,除非你想做一些 XPath 风格的 LINQ 查询,但这绝对不是更优雅。 嗯,你的建议仍然是我所希望的;)【参考方案5】:

这将从 XElement 返回前缀:

myElement.GetPrefixOfNamespace(node.Name.Namespace);

【讨论】:

不,它没有,它返回命名空间的 URI 部分,而不是前缀。

以上是关于C#:如何从 XElement 中获取名称(带前缀)作为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

c# foreach 没有在循环中获取下一个 XElement 名称

C#用命名空间前缀编写XElement,但不包括根元素中的前缀

从 XElement 获取子元素 [重复]

C# - 如何从 XElement 中删除 xmlns

如何在c#中使用xelement获取xml节点值

如何使用 XElement 打开 xml?