【发布时间】:2013-07-08 13:24:14
【问题描述】:
如果有人能解释这一点,我会感到惊讶,但如果其他人能重现我正在经历的怪事,我会很有趣......
我们有一个基于处理大量表单的 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。
【问题讨论】:
-
XmlDocument不是LINQ -
@MarcinJuraszek LINQ 在这里用于处理 XmlDocument 的节点(是的,很奇怪)
-
正确,但我也使用 LINQ(在哪里)。由于我不知道错误的来源,因此我将其标记为两者。
-
@thedag:我格式化了你的 Xml 片段。与任何其他代码 sn-p 一样,只需将代码缩进 4 个空格即可。
-
啊 - 我做了一个小改动,这似乎表明问题与 LINQ 有关。我更改了 Dbug 调用,因此它不会调用 Count() 扩展(只需在其中放置一个常量),然后永远不会删除最后一个字段!