我正在使用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>
答案 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());
结果:
答案 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", "")))
以这种方式。