Как извлечь данные XML - PullRequest
1 голос
/ 07 июля 2011

У меня есть XML-файл со следующими данными,

<extcode Type="abc" Code="12345" />

Я хочу иметь возможность извлекать код, то есть 12345, для строк, где типом является abc. Я пытался

XPathSelectElements("Type[@name='abc']")

но ничего не вернулось.

Спасибо.

Edit Я понял, что проблема с пространством имен. Файл XML похож на aw:extcode вместо extcode, и это привело к тому, что запрос не работал должным образом. Как мне это сделать при наличии пространства имен? Когда я пытался использовать

XmlNameTable nameTable = doc.NameTable;

компилятор жалуется, что не может разрешить NameTable.

Ответы [ 5 ]

3 голосов
/ 07 июля 2011

Используйте этот XPath: //extcode[@Type = 'abc']/@Code

2 голосов
/ 07 июля 2011

Лично я бы использовал LINQ to XML, как мой предпочтительный способ работы с данными XML. Примерно так:

XDocument doc = XDocument.Load("test.xml");

int code = doc.Descendants("extCode")
              .Where(x => (string) x.Attribute("Type") == "abc")
              .First()
              .Attribute("Code");

Одной из причин, по которой ваш XPath не работает, может быть то, что атрибут называется «Тип», а не «имя», хотя ...

0 голосов
/ 07 июля 2011

Edit Я понял, что проблема в с пространством имен. XML-файл похож на aw: extcode вместо просто extcode и что заставило запрос не работать должным образом. Как мне это сделать в наличие пространства имен?

Написание выражения XPath для применения к документу XML с пространствами имен является одним из наиболее часто задаваемых вопросов о XPath.

Используйте перегрузку XmlNode.SelectNodes(), которая имеет XmlNamespaceManager в качестве второго аргумента .

Первая ссылка на страницу содержит полный пример кода, подходящий для вашего случая.

Альтернативными способами являются XPathNavigator.Evaluate () или XPathNavigator.Select () перегрузки, которые используют в качестве второго аргумента IXmlNamespaceResolver .

С LINQ вы можете использовать метод Extensions.XPathEvaluate () .

0 голосов
/ 07 июля 2011
XDocument xmlDoc = XDocument.Load(Server.MapPath("~/FolderName/FileName.xml"));

var output= from obj in xmlDoc.Element("extcode")
            where obj.Attribute("Type").Value.ToLower() == "abc"
            select obj;

DataTable outputTable = new DataTable();
outputTable.Columns.Add(new DataColumn("code"));

foreach (var item in output)
{
   DataRow outputRows = outputTable.NewRow();

   if (outputRows != null)
   {
      outputRows["Code"] = item.Element("code").Value;
   }
}
outputTable.Rows.Add(problemsRows);
outputTable.AcceptChanges();

теперь у нас есть таблица выходных данных, которую вы можете использовать там, где вам нужно.

0 голосов
/ 07 июля 2011

Вы можете написать так ↓

        XDocument doc = XDocument.Load("test.xml");
        var x = doc.Root.XPathSelectElement("./extcode[@Type='abc']");
        Console.WriteLine("x:" + x.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...