C# 将具有值的XElement转换为空元素(其中XElement.IsEmpty=true)

C# 将具有值的XElement转换为空元素(其中XElement.IsEmpty=true),c#,.net,C#,.net,我正在使用C#.Net 3.5,试图将给定的xml(XDocument)转换为不包含文本值的空xml(其中XElement.IsEmpty为true)。我尝试将XElement.Value设置为String.Empty,但结果是,这不是我需要的。我需要它是。有人能建议如何在.NET中实现这一点吗 以下是输入示例: <Envelope> <Body> <Person> <fir

我正在使用C#.Net 3.5,试图将给定的xml(XDocument)转换为不包含文本值的空xml(其中XElement.IsEmpty为true)。我尝试将XElement.Value设置为String.Empty,但结果是
,这不是我需要的。我需要它是
。有人能建议如何在.NET中实现这一点吗

以下是输入示例:

    <Envelope>
        <Body>
            <Person>
                <first>John</first>
                <last>Smith</last>
                <address>123</address>
            </Person>
        </Body>
    <Envelope>

约翰
史密斯
123
预期产出:

    <Envelope>
        <Body>
            <Person>
                <first />
                <last />
                <address />
            </Person>
        </Body>
    <Envelope>

尝试创建不带值的新XElement:

var xElement = new XElement("Envelope", new XElement("Body", new XElement("Person", "")))
以这种方式。

您可以使用函数将所需的元素替换为空元素:

var xml = @"<Envelope>
        <Body>
            <Person>
                <first>John</first>
                <last>Smith</last>
                <address>123</address>
            </Person>
        </Body>
    </Envelope>";
var doc = XDocument.Parse(xml);
foreach (XElement propertyOfPerson in doc.XPathSelectElements("/Envelope/Body/Person/*").ToList())
{
    propertyOfPerson.ReplaceWith(new XElement(propertyOfPerson.Name.LocalName));
}
Console.WriteLine(doc.ToString());
var xml=@”
约翰
史密斯
123
";
var doc=XDocument.Parse(xml);
foreach(doc.XPathSelectElements(“/Envelope/Body/Person/*”)中的XElement propertyOfPerson.ToList())
{
ReplaceWith(新的XElement(propertyOfPerson.Name.LocalName));
}
Console.WriteLine(doc.ToString());
结果:
为了分享,虽然我接受了上面的答案,但实际上我采用了以下方法,并使用XSLT将XML转换为我想要的内容,因此使用以下代码:

//an XSLT which removes the values and stripes the white spaces
const string xslMarkup = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"> <xsl:output method=\"xml\" omit-xml-declaration=\"yes\" indent=\"no\"/> <xsl:strip-space elements=\"*\"/> <xsl:template match=\"@* | node()\"> <xsl:copy> <xsl:apply-templates select=\"@* | node()\"/> </xsl:copy> </xsl:template> <xsl:template match=\"node()|@*\"> <xsl:copy> <xsl:apply-templates select=\"node()|@*\"/> </xsl:copy> </xsl:template><xsl:template match=\"*/text()\"/> </xsl:stylesheet>";

var transformedXml = new XDocument();
XNode xml = YOUR_XML_OBJECT_HERE;
using (var writer = transformedXml.CreateWriter())
{
    // Load the XSLT
    var xslt = new XslCompiledTransform();
    xslt.Load(XmlReader.Create(new StringReader(xslMarkup)));

    // Execute the transform and output the results to a writer.
    xslt.Transform(xml.CreateReader(), writer);
}

return transformedXml.ToString(SaveOptions.DisableFormatting);
//一种XSLT,用于删除值并在空白处加条纹
常量字符串xslMarkup=“”;
var transformedXml=new XDocument();
XNode xml=此处的\u xml\u对象;
使用(var writer=transformedXml.CreateWriter())
{
//加载XSLT
var xslt=新的XslCompiledTransform();
Load(XmlReader.Create(newstringreader(xslMarkup));
//执行转换并将结果输出到编写器。
Transform(xml.CreateReader(),writer);
}
返回transformedXml.ToString(SaveOptions.DisableFormatting);

请完成这个想法。如前所述,这并不能很好地回答问题。对不起,从我的智能手机上写信。现在试试看