次の XML のスニペットがあります (Zimbra SOAP API は気にする人がいるかもしれませんが、重要ではありません)。
<appt id="266" uid="bf177af2-2875-447a-8e74-d9bc8c108611" nextAlarm="1409547300000" d="1380213518000" rev="63" s="0" l="10" xmlns="urn:zimbraMail">
<inv id="265" seq="3" compNum="0" type="appt">
このスニペットを含む XmlElement があります。次のように、名前空間マネージャーなどを設定しました
XmlNamespaceManager ns = new XmlNamespaceManager(element.OwnerDocument.NameTable);
ns.AddNamespace("prefix", "urn:zimbraMail");
次のコード
element.SelectSingleNode("//prefix:" + "appt/@id", ns).Value
期待どおり 266 を返します
しかし、基本的にapptの属性を除いて、appt、appt/invなどを選択することはできません。ここに私が試したいくつかのクエリがあります。null を返すものもあれば、不正な形式を返すものもあります (私がぐるぐる回っていたので)
element.SelectSingleNode("//prefix:" + "appt/inv", ns).Value
element.SelectSingleNode("//prefix:" + "/appt/inv", ns).Value
element.SelectSingleNode("//prefix:" + "/inv", ns).Value
element.SelectSingleNode("//prefix:" + "appt", ns).Value
また、接頭辞などを含めないようにしました。この問題の一部は、OwnerDoc が SOAP エンベロープであり、それが名前空間を台無しにしている可能性がありますが、最初のクエリが機能するのはなぜでしょうか? (ちなみに、最初のクエリは、プレフィックス/名前空間ロジックを使用しなくても機能します)