创建没有属性和第一个元素的XmlDocument

时间:2014-01-19 22:49:42

标签: c# xml xmldocument

我想创建一个忽略第一行的XmlDocument对象,并删除所有其他元素的所有属性。 我该怎么做? xml字符串和我拥有的代码如下所示。

<?xml version="1.0" encoding="utf-8"?>
<boolean xmlns="http://tempuri.org/">true</boolean>

我正在使用的C#中的代码是:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);//xmlString is the value in snippet above this

2 个答案:

答案 0 :(得分:1)

为了删除所有属性,只需在每个节点上调用.RemoveAllAttributes()方法,但要小心:名称为xlmns的属性不会被视为普通属性。这些是命名空间内容的一部分,您需要以不同的方式删除它们: Answer to: C# How to remove namespace information from XML elements

string xmlPath = @"D:\test.xml";
XDocument d = XDocument.Load(xmlPath);

var allNodes = d.Descendants();

foreach (var node in allNodes)
{
    //Removes ALL attributes except namespace attributes like 'xmlns="..."'
    node.RemoveAttributes();
}

要删除开头的声明:

//Instead of using XDocument.Save() , use XmlWrite to Remove the declaration
XmlWriterSettings xws = new XmlWriterSettings();
xws.OmitXmlDeclaration = true;
xws.Indent = true;
using (var stream = File.Create(@"D:\testNew.xml"))
using (XmlWriter xw = XmlWriter.Create(stream, xws))
{
    d.Save(xw);
}

答案 1 :(得分:1)

我从this SO question派生了这个解决方案。这是一个完整的MSTest课程。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var xmlString = @"<?xml version=""1.0"" encoding=""utf-8""?>
                            <root>
                                <boolean xmlns=""http://tempuri.org"" atr=""test"">true</boolean>
                                <boolean xmlns=""http://tempuri.org"" atr=""test"">true</boolean>
                                <boolean xmlns=""http://tempuri.org"" atr=""test"">true</boolean>
                                <boolean xmlns=""http://tempuri.org"" atr=""test"">true</boolean>
                            </root>";
        var xElement = XElement.Parse(xmlString);


        var expectedXmlString = @"<root>
                                <boolean>true</boolean>
                                <boolean>true</boolean>
                                <boolean>true</boolean>
                                <boolean>true</boolean>
                            </root>";
        var expectedXElement = XElement.Parse(expectedXmlString);

        var actualXElement = stripAttributes(xElement);

        Assert.AreEqual(expectedXElement.ToString(), actualXElement.ToString());
    }

    static XElement stripAttributes(XElement root)
    {
        return new XElement(
            root.Name.LocalName,
            root.HasElements ?
                root.Elements().Select(el => stripAttributes(el)) :
                (object)root.Value
        );
    }
}