我正在编辑一系列XML文件,我需要删除名为“foo”的所有属性。此属性出现在多种元素中。 XML中的示例代码段可能是:
<bodymatter id="######">
<level1 id="######">
<pagenum page="#####" id="######" foo="######" />
<h1 id="#####" foo="#####">Header</h1>
<imggroup id="#######">
.
.
etc.
我使用的最佳解决方案是使用Regex:
Regex regex = new Regex("foo=\"" + ".*?" + "\"", RegexOptions.Singleline);
content = regex.Replace(content, "");
我知道内置的XML解析器可以提供帮助,但理想情况下,我希望在不必处理整个XML解析器的包袱的情况下进行简单的XML替换/删除。 在这种情况下Regex是最好的解决方案吗?
修改:
在XmlDocument类中进行了一些研究后,我提出了一个可能的解决方案(删除存储在数组“ids”中的多个属性类型):
private void removeAttributesbyName(string[] ids)
{
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNodeList xnlNodes = doc.GetElementsByTagName("*");
foreach (XmlElement el in xnlNodes)
{
for (int i = 0; i <= ids.Length - 1; i++)
{
if (el.HasAttribute(ids[i]))
{
el.RemoveAttribute(ids[i]);
}
if (el.HasChildNodes)
{
foreach (XmlNode child in el.ChildNodes)
{
if (child is XmlElement && (child as XmlElement).HasAttribute(ids[i]))
{
(child as XmlElement).RemoveAttribute(ids[i]);
}
}
}
}
}
}
我不知道这是否尽可能高效,但我已经测试了它,似乎工作正常。
答案 0 :(得分:7)
不要使用正则表达式进行XML操作。您可以使用Linq to XML:
XDocument xdoc = XDocument.Parse(xml);
foreach (var node in xdoc.Descendants().Where(e => e.Attribute("foo")!=null))
{
node.Attribute("foo").Remove();
}
string result = xdoc.ToString();
答案 1 :(得分:2)
在这种情况下,Regex是最佳解决方案吗?
没有
您希望在对象级别使用适用于XML的内容(例如,XmlElement
而不是string
级别。
答案 2 :(得分:0)
我使用以下命令删除命名空间。这也可以用于从其他节点中删除属性。
FileStream fs = new FileStream(filePath, FileMode.Open);
StreamReader sr = new StreamReader(fs);
DataSet ds = new DataSet();
ds.ReadXml(sr);
ds.Namespace = "";
string outXML = ds.GetXml();
ds.Dispose();
sr.Dispose();
fs.Dispose();