Каков точный xpath для первых дочерних узлов узла? - PullRequest
0 голосов
/ 30 сентября 2010

У меня есть такой XML-код:

<?xml version="1.0" encoding="utf-8" ?> 
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Grid>
            <Label/>
            <Label/>
            <Label/>
    </Grid>
</Window>

В коде это представляется в виде XML-документа. Вопрос в следующем коде:

public XmlNodeList GetAllChildrenOfName(XmlNode parent, string childName) 
{
    string xpath = childName;
    //string xpath = "/" + childName;
    //string xpath = "//" + childName;

    return parent.SelectNodes(xpath);
}

Если я вызываю метод для узла xml сетки (GetAllChildrenOfName(gridNode,"Label")) из приведенного выше кода xml, он не возвращает ожидаемый список из 3 меток для любого из предложенных значений xpath.

Есть предположения, как должен выглядеть xpath?

Спасибо

Ответы [ 3 ]

3 голосов
/ 30 сентября 2010

child:: - это ось по умолчанию, поэтому, если parent - это Grid, то parent.SelectNodes("Label") должно работать, при условии , что Label находится в пространстве имен по умолчанию.Если у вас есть xml-namespaces, вам нужно его квалифицировать, создав менеджер пространства имен:

var nsmgr = new XmlNamespaceManager(parent.OwnerDocument.NameTable);
nsmgr.AddNamespace("foo","blah/your/namespace");
return parent.SelectNodes("foo:Label", nsmgr);
1 голос
/ 30 сентября 2010

Это сработало для меня:

static int Main(string[] args)
{
    XmlDocument xDoc = new XmlDocument();
    xDoc.LoadXml("<Grid><Label /><Label /><Label /></Grid>");
    Response.Write(GetAllChildrenOfName(xDoc.FirstChild, "Label").Count.ToString());
}

public XmlNodeList GetAllChildrenOfName(XmlNode parent, string childName)
{
    string xpath = childName;
    return parent.SelectNodes(xpath);
}

И на выходе было 3.

0 голосов
/ 05 октября 2010

Поскольку я не нашел, почему решение, которое работает для других, не работает для меня, я просто использовал свой собственный метод, подобный этому:

private List<XmlNode> SelectNamedChildNodes(XmlNode parent, string name)
        {
            List<XmlNode> list = new List<XmlNode>();
            foreach (XmlNode node in parent.ChildNodes)
            {
                if (node.Name == name) list.Add(node);
            }
            return list;
        }

Можно работать с результатом точно так же, как с XmlNodeList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...