将带有值的XElement转换为Empty元素(其中XElement.IsEmpty = true)

时间:2014-04-12 22:13:35

标签: c# .net

我正在使用C#.Net 3.5并尝试将给定的xml(XDocument)转换为空的(XElement.IsEmpty为真),不包含任何文本值。我尝试将XElement.Value设置为String.Empty,但这导致<element><element>并不是我需要的。我需要它<element />。有人可以建议如何在.NET中完成这项工作。

下面是输入示例:

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

预期产出:

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

3 个答案:

答案 0 :(得分:3)

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

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());

结果: enter image description here

答案 1 :(得分:2)

有兴趣分享,虽然我已经接受了上面的答案,但我实际上采用了以下方法并使用A 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);

答案 2 :(得分:0)

尝试创建没有值的新XElement:

var xElement = new XElement("Envelope", new XElement("Body", new XElement("Person", "")))

以这种方式。