誰かがこれを説明できたら驚くだろうが、他の人が私が経験している奇妙さを再現できるかどうかを知ることは興味深い.
多くのフォームを処理する InfoPath に基づくものがあります。フォーム データは XSD に準拠する必要がありますが、InfoPath は独自のメタデータをいわゆる "my-fields" の形式で追加し続けます。my-field を削除したいので、次の簡単な方法を書きました。
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 には 1 つの「my-field」が残ります。
便利な 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>
"my:field3" 要素 (下部のテキスト "Blah blah") は、Dbug を呼び出さない限り削除されません。
宇宙がこのようなものであってはならないことは明らかですが、他の人が再現できるかどうか知りたいです.
Win8 Enterprise 6.2.9200 で VS2012 Premium (11.0.50727.1 RTMREL) と FW 4.5.50709 を使用しています。