XPathSelectElements возвращает ноль - PullRequest
0 голосов
/ 20 декабря 2011

Функция загрузки уже определена в классе xmlData

public class XmlData
{
    public void Load(XElement xDoc)
    {
        var id = xDoc.XPathSelectElements("//ID");
        var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");
    }
}

Я просто вызываю функцию Load с моего конца.

            XmlData aXmlData = new XmlData();

            string input, stringXML = "";
            TextReader aTextReader = new StreamReader("D:\\test.xml");
            while ((input = aTextReader.ReadLine()) != null)
            {
                stringXML += input;
            }
            XElement Content = XElement.Parse(stringXML);
            aXmlData.Load(Content);

в функции загрузки, я получаю id и listIds как ноль.

Мой test.xml содержит

<SEARCH>
  <ID>11242</ID>
  <Lists>
    <List CURRENT="true" AGGREGATEDCHANGED="false">
      <ListIDS>
        <ListID>100567</ListID>
        <ListID>100564</ListID>
        <ListID>100025</ListID>
        <ListID>2</ListID>
        <ListID>1</ListID>
      </ListIDS>
    </List>
  </Lists>
</SEARCH>

Ответы [ 4 ]

6 голосов
/ 20 декабря 2011

РЕДАКТИРОВАТЬ: ваш образец XML не имеет элемент id в пространстве имен с псевдонимом nss.В этом случае это будет <nss:id>, или будет настроено пространство имен по умолчанию.Для этого ответа я предположил, что на самом деле элемент, который вы ищете , равен в пространстве имен.

Ваш запрос пытается найти элемент с именем id на корневом уровне.,Чтобы найти всех id элементов, вам необходимо:

var tempId = xDoc.XPathSelectElements("//nss:id", ns);

... хотя лично я бы использовал:

XDocument doc = XDocument.Parse(...);
XNamespace nss = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner";
// Or use FirstOrDefault(), or whatever...
XElement idElement = doc.Descendants(nss + "id").Single();

(я предпочитаю использоватьметоды запросов для типов LINQ to XML вместо XPath ... мне легче избежать глупых синтаксических ошибок и т. д.)

Ваш пример кода также неясен, так как вы используете xDoc, который не былобъявлено ... это помогает писать полных примеров, в идеале включая все необходимое для компиляции и запуска в качестве консольного приложения.

1 голос
/ 20 декабря 2011

Я смотрю на вопрос через 3 часа после его отправки и через 41 минуту после (последнего) редактирования.

В предоставленном XML-документе не определены пространства имен.

    var listIds = xDoc.XPathSelectElements("/Lists//List/ListIDS/ListIDS");

Это выражение XPath, очевидно, не выбирает ни одного узла из предоставленного XML-документа, посколькуXML-документ не имеет верхнего элемента с именем Lists (имя фактического верхнего элемента SEARCH)

var id = xDoc.XPathSelectElements("//ID");

в функции загрузки, и я получаю как id, так и listIds какnull.

Это утверждение ложно, поскольку //ID выбирает единственный элемент с именем ID в предоставленном XML-документе, поэтому значение переменной C # id не равно нулю.Возможно, вы не провели тщательного тестирования после редактирования документа XML.

Скорее всего, исходный элемент ID принадлежал к некоторому пространству имен.Но теперь он находится «без пространства имен», и приведенное выше выражение XPath его выбирает.

0 голосов
/ 21 декабря 2011

Причиной нулевого значения или системного возвращаемого значения является следующая

 var id = xDoc.XPathSelectElements("//ID");

XpathSElectElements - это System.xml.linq.XElment, который является датой запроса linq. Это не может быть прямо поставлено как таковое. Получить индивидуальный первый элемент соответствия use XPathSelectElement ("// ID"); Вы можете проверить количество вхождений, используя XPathSelectElements, как

var count=xDoc.XPathSelectElements("//ID").count();

вы также можете запросить оператор linq как заказ, используя определенные условия

Порядок получения значения узла из списка, который вы можете использовать

foreach (XmlNode xNode in xDoc.SelectNodes("//ListIDS/ListID"))
{
Console.WriteLine(xNode.InnerText);
}

Для второго списка вы получили значение, поскольку XPath для элементов списка неверен

0 голосов
/ 20 декабря 2011
        string xmldocument = "<response xmlns:nss=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\"><action>test</action><id>1</id></response>";

        XElement Content = XElement.Parse(xmldocument);
        XPathNavigator navigator = Content.CreateNavigator();
        XmlNamespaceManager ns = new XmlNamespaceManager(navigator.NameTable);
        ns.AddNamespace("nss", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
        var tempId = navigator.SelectSingleNode("/id");
...