0

いくつかの短いXMLセグメント(それぞれにファイルの説明があります)を含むXPathNodeIteratorを作成しました。

XPathNodeIterator segments = node.SelectDescendants("Segment", node.NamespaceURI, false);

さて、それらをループしようとすると、毎回最初のセグメントだけが選択されているようです。これが私が試したループの2つのバージョンです(たとえば、File / Filesクラスのみ):

while (segments.MoveNext())
{
    File f = GetSingleFileDataFromSegment(segments.Current);

    files.Add(f);
}

別の試み:

foreach (XPathNavigator seg in segments)
{
    File f = GetSingleFileDataFromSegment(seg);

    files.Add(f);
}

WatchまたはQuickwatchを使用してループ内の単一のセグメントを表示すると、すべての異なるセグメントが一度に1つずつ選択されるように見えますが、最終的には「ファイル」に最初のセグメントの複数のコピーが含まれます。

これはXPathNodeIteratorでの通常の動作ですか?それともここに何か足りないものがありますか?現在、.NETFramework3.5を使用しています。

4

1 に答える 1

0

問題は、XPathを使用して適切なセグメントを取得するGetSingleFileDataFromSegmentメソッドにありました。セグメント属性には名前空間が含まれており、NamespaceManagerを使用する必要がありました。

誤ったXPath式:

f.Location = seg.XPathSelectElement("//*[local-name()='Location']").Value; 

修正されたバージョン:

System.Xml.XmlNamespaceManager nsmanager = new System.Xml.XmlNamespaceManager(seg.ToXmlDocument().NameTable);
nsmanager.AddNamespace("ns", seg.Elements().FirstOrDefault().GetDefaultNamespace().NamespaceName);
f.Location = seg.XPathSelectElement("./ns:Location", nsmanager).Value;

上記のコードは、セグメントをパラメーターとして受け取ったメソッドに含まれていました。

于 2011-09-26T08:03:52.610 に答える