我解析XML文件,将其与另一个XML文件进行比较。 XML Diff工作得很好,但是我们发现有很多垃圾标签存在于一个文件中,而不存在于另一个文件中,这与我们的结果无关,但会使报告混乱。我已经将XML文件加载到内存中以执行其他一些操作,并且我想知道是否有一种简单的方法可以同时浏览该文件,并删除所有以该文件开头的标记,作为示例颜色=。颜色的值在整个地图上,所以不容易抓住它们全部删除它们。
似乎没有任何方式可以在XML Diff中指定,"忽略这些标记"。
我可以浏览文件,找到每个实例,找到它的结尾,删除它,但我希望会有更简单的东西。如果没有,哦,好吧。
编辑:这是XML的一部分:
<numericValue color="-103" hidden="no" image="stuff.jpg" key="More stuff." needsQuestionFormatting="false" system="yes" systemEquivKey="Stuff." systemImage="yes">
<numDef increment="1" maximum="180" minimum="30">
<unit deprecated="no" key="BPM" system="yes" />
</numDef>
</numericValue>
答案 0 :(得分:3)
如果您使用Linq to XML,则可以通过以下方式将XML加载到XDocument
:
var doc = XDocument.Parse(xml); // Load the XML from a string
或者
var doc = XDocument.Load(fileName); // Load the XML from a file.
然后搜索具有匹配名称的所有元素,并使用System.Xml.Linq.Extensions.Remove()
一次删除所有元素:
string prefix = "L"; // Or whatever.
// Use doc.Root.Descendants() instead of doc.Descendants() to avoid accidentally removing the root element.
var elements = doc.Root.Descendants().Where(e => e.Name.LocalName.StartsWith(prefix, StringComparison.Ordinal));
elements.Remove();
<强>更新强>
在您的XML中,color="-103"
子字符串是元素的attribute,而不是元素本身。要删除所有此类属性,请使用以下方法:
public static void RemovedNamedAttributes(XElement root, string attributeLocalNamePrefix)
{
if (root == null)
throw new ArgumentNullException();
foreach (var node in root.DescendantsAndSelf())
node.Attributes().Where(a => a.Name.LocalName == attributeLocalNamePrefix).Remove();
}
然后称之为:
var doc = XDocument.Parse(xml); // Load the XML
RemovedNamedAttributes(doc.Root, "color");