如果有人能解释这一点,我会感到惊讶,但知道其他人是否可以重现我正在经历的怪异会很有趣......
我们有一个基于处理大量表单的 InfoPath 的东西。表单数据应该符合 XSD,但 InfoPath 不断以所谓的“我的字段”的形式添加自己的元数据。我们想删除我的字段,我写了这个简单的方法:
string StripMyFields(string xml)
{
var doc = new XmlDocument();
doc.LoadXml(xml);
var matches = doc.SelectNodes("//node()").Cast<XmlNode>().Where(n => n.NamespaceURI.StartsWith("http://schemas.microsoft.com/office/infopath/"));
Dbug("Found {0} nodes to remove.", matches.Count());
foreach (var m in matches)
m.ParentNode.RemoveChild(m);
return doc.OuterXml;
}
现在来了真正奇怪的东西!当我运行此代码时,它的行为与我预期的一样,删除了 InfoPath 命名空间中的所有节点。但是,如果我注释掉对 Dbug 的调用,则代码完成,但 XML 中仍保留一个“我的字段”。
我什至注释掉了方便的 Dbug 方法的内容,它的行为仍然相同:
void Dbug(string s, params object[] args)
{
//if (args.Length > 0)
// s = string.Format(s, args);
//Debug.WriteLine(s);
}
输入 XML:
<?xml version="1.0" encoding="UTF-8"?>
<skjema xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-03-03T22:25:25" xml:lang="en-us">
<Field-1643 orid="1643">data.</Field-1643>
<my:myFields>
<my:field1>Al</my:field1>
<my:group1>
<my:group2>
<my:field2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">2009-01-01</my:field2>
<Field-1611 orid="1611">More data.</Field-1611>
<my:field3>true</my:field3>
</my:group2>
<my:group2>
<my:field2>2009-01-31</my:field2>
<my:field3>false</my:field3>
</my:group2>
</my:group1>
</my:myFields>
<Field-1612 orid="1612">Even more data.</Field-1612>
<my:field3>Blah blah</my:field3>
</skjema>
除非我调用 Dbug,否则不会删除“my:field3”元素(在底部,文本“Blah blah”)。
显然宇宙不应该是这样的,但我很想知道其他人是否能够复制。
我在 Win8 Enterprise 6.2.9200 上使用 VS2012 Premium (11.0.50727.1 RTMREL) 和 FW 4.5.50709。