C# 如何从XML文档中以XML字符串的形式获取特定名称的元素?(附XDocument)

C# 如何从XML文档中以XML字符串的形式获取特定名称的元素?(附XDocument),c#,xml,linq-to-xml,C#,Xml,Linq To Xml,如何从XML文档中以XML字符串的形式获取特定名称的元素?(附XDocument) 也就是说,假设我有: <root> <orange id="orange1"></orange> <orange id="orange2"></orange> <orange id="orange3"></orange> <apple id="apple1"></apple>

如何从XML文档中以XML字符串的形式获取特定名称的元素?(附XDocument)

也就是说,假设我有:

<root>
    <orange id="orange1"></orange>
    <orange id="orange2"></orange>
    <orange id="orange3"></orange>

    <apple id="apple1"></apple>
    <apple id="apple2"></apple>
    <apple id="apple3"></apple>
</root>

…但在本例中,
最终为:
System.Xml.Linq.XContainer+d_ua
,而不是Xml字符串。我似乎找不到任何方法可以将匹配元素的XML返回给我。

问题是,您正在调用
子体()
的结果,调用
ToString()
。我们并不清楚您期望它做什么,但是您已经正确地获得了元素。例如:

using (TextReader reader = File.OpenText(xmlFilePath))
{
    // Any reason for not using XDocument.Load(xmlFilePath)?
    XDocument xmlDocument = XDocument.Load(reader);
    var items = xmlDocument.Descendants("apple");
    foreach (var item in items)
    {
        Console.WriteLine(item.Attribute("id").Value); // Or whatever
    }
}
如果要将每个
XElement
转换为字符串的结果连接起来,可以使用:

var items = string.Join("", xmlDocument.Descendants("apple"));


问题是您正在调用
ToString()
,调用的结果是调用
子体()
。我们并不清楚您期望它做什么,但是您已经正确地获得了元素。例如:

using (TextReader reader = File.OpenText(xmlFilePath))
{
    // Any reason for not using XDocument.Load(xmlFilePath)?
    XDocument xmlDocument = XDocument.Load(reader);
    var items = xmlDocument.Descendants("apple");
    foreach (var item in items)
    {
        Console.WriteLine(item.Attribute("id").Value); // Or whatever
    }
}
如果要将每个
XElement
转换为字符串的结果连接起来,可以使用:

var items = string.Join("", xmlDocument.Descendants("apple"));


使用
String.Concat(xmlDocument.substands(“apple”))
使用
String.Concat(xmlDocument.substands(“apple”)
您正在对一组xml元素使用
ToString()
,因此得到了结果。如果我正确阅读了您的需求,您需要:

var items = String.Join(Environment.NewLine,
                        xmlDocument.Descendants("apple")
                                   .Select(e => e.ToString()));

您正在对一组xml元素使用
ToString()
,从而得到结果。如果我正确阅读了您的需求,您需要:

var items = String.Join(Environment.NewLine,
                        xmlDocument.Descendants("apple")
                                   .Select(e => e.ToString()));

你是对的,没有正确阅读问题。谢谢提醒。我正在尝试合并两个XML文件(一个模板和一个包含一些数据项的不同XML文件)。我不需要访问任何实际值,也不想使用对象,因为“在现实生活中”XML比我的示例显示的要复杂得多(例如“apple”元素是一个深树结构)。@NickG:你说的“我不想使用对象”是什么意思?如果处理
XElement
对象而不是字符串,您的代码可能会更干净……我知道这似乎是错误的,但在这种特殊情况下,我的程序根本不关心文件中的数据(它只是一个预处理器)-它实际上只需要将它们与任何名为“apples”的标记中的所有XML合并在一起,以替换单独文件中的占位符标记。所有关于XML的实际工作都是在不同的应用程序中完成的,这将它们反序列化为对象。因此,您的第二个代码块正是我所需要的-非常感谢!你是对的,没有正确阅读问题。谢谢提醒。我正在尝试合并两个XML文件(一个模板和一个包含一些数据项的不同XML文件)。我不需要访问任何实际值,也不想使用对象,因为“在现实生活中”XML比我的示例显示的要复杂得多(例如“apple”元素是一个深树结构)。@NickG:你说的“我不想使用对象”是什么意思?如果处理
XElement
对象而不是字符串,您的代码可能会更干净……我知道这似乎是错误的,但在这种特殊情况下,我的程序根本不关心文件中的数据(它只是一个预处理器)-它实际上只需要将它们与任何名为“apples”的标记中的所有XML合并在一起,以替换单独文件中的占位符标记。所有关于XML的实际工作都是在不同的应用程序中完成的,这将它们反序列化为对象。因此,您的第二个代码块正是我所需要的-非常感谢!