我想创建一个忽略第一行的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
答案 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
);
}
}