开发者

Looping through XPathNodeIterator problem

开发者 https://www.devze.com 2023-04-08 09:29 出处:网络
I\'ve created a XPathNodeIterator that contains a few short XML segments (each with a file description):

I've created a XPathNodeIterator that contains a few short XML segments (each with a file description):

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

Now, when trying to loop them, it seems that only the first segment is picked every time. Here are two versions of the loops I've tried (File/Files classes only for example):

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

    files.Add(f);
}

Another try:

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

    files.Add(f);
}

When viewing a single segment in a loop with Watch or Quickwatch, it looks as it should, all different segments are selected one at a time - but end result is that "files" contain multiple copies of the first segment.

Is this normal beh开发者_运维问答avior with XPathNodeIterator? Or is something missing here? I'm currently using .NET Framework 3.5.


The problem was in GetSingleFileDataFromSegment -method, which used XPath to get the proper segment. The segment attributes had namespaces in them, and that required the use of a NamespaceManager.

Faulty XPath expression:

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

Corrected version:

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;

Code above was in the method that received the segment as parameter.

0

精彩评论

暂无评论...
验证码 换一张
取 消