检索具有混合内容的完整XElement字符串

时间:2013-03-07 19:53:07

标签: c# xml .net-3.5 linq-to-xml

假设我在XElement对象

中有以下内容
<root>Hello<child>Wold</child></root>

如果我使用XElement.ToString(),这会给我

"<root xmnls="someschemauri">Hello<child>World</child></root>"

如果我使用XElement.Value,我会得到

"Hello World"

我需要

"Hello <child>World</child>"

执行此操作的正确功能是什么(如果有)?

6 个答案:

答案 0 :(得分:4)

.NET 4的解决方案

var result = String.Join("", rootElement.Nodes()).Trim();

完整代码(适用于.NET 3.5):

XElement rootElement = XElement.Parse("<root>Hello<child>Wold</child></root>");
var nodes = rootElement.Nodes().Select(n => n.ToString()).ToArray();
string result = String.Join("", nodes).Trim();
Console.WriteLine(result);
// writes "Hello<child>World</child>"

无需加入所有节点的快速解决方案:

XElement rootElement = XElement.Parse("<root>Hello<child>Wold</child></root>");
var reader = rootElement.CreateReader();
reader.MoveToContent();
string result = reader.ReadInnerXml(); 

答案 1 :(得分:1)

这很有效:

//SOLUTION BY Nenad
var element = XElement.Parse("<root>Hello<child>World</child></root>");
string xml = string.Join("", element.DescendantNodes().Select(e => e.ToString()));
Debug.WriteLine(xml);

最终输出:Hello<child>Wold</child>World


尝试#3

XDocument xDoc = XDocument.Parse(@"<root>Hello<child>World</child></root>");
XElement rootElement = xDoc.Root;
Debug.WriteLine(rootElement.Value + rootElement.FirstNode.ToString());

答案 2 :(得分:1)

这样做:

var element = XElement.Parse("<root>Hello<child>Wold</child></root>");
string xml = string.Join("", element.Nodes().Select(e => e.ToString()));

对于.NET 3.5(如果这是问题点):

var element = XElement.Parse("<root>Hello<child>Wold</child></root>");
string xml = string.Join("", element.Nodes().Select(e => e.ToString()).ToArray());

答案 3 :(得分:1)

扩展方法基于最快的已知解决方案:

public static class XElementExtension
{
    public static string InnerXML(this XElement el) {
        var reader = el.CreateReader();
        reader.MoveToContent();
        return reader.ReadInnerXml();
    }
}

然后简单地称之为:xml.InnerXML();

答案 4 :(得分:0)

我没有时间对此进行测试,但请尝试:

var inners = from n in xelementVariableName.Nodes()
                       select n;
return String.Join(String,Empty, inners);

测试:

public static string ReturnInnerXml()
{
    var doc = XDocument.Parse(@"<root>Hello<child>World</child></root>");
    var root = doc.Root;
    if (root == null)
    {
        throw new InvalidOperationException("No root");
    }

    var inners = from n in root.Nodes()
                 select n;
    return String.Join(String.Empty, inners);
}

这会产生:

Hello<child>World</child>

使用.NET 4.0。

答案 5 :(得分:0)

这是:

var element = XElement.Parse("<root>Hello<child>Wold</child></root>");
string xml = string.Join("", element.Nodes().Select(e => e.ToString()).ToArray());

返回Hello<child>Wold</child>并适用于.NET 3.5