Чтение XML-файла с использованием выражения XPath в C # - PullRequest
0 голосов
/ 28 декабря 2018

У меня сейчас проблема с чтением файла XML с использованием выражения XPath.Я использовал класс XMLdocument.Когда я пытаюсь прочитать конкретный узел из XML, я получаю пустой список.Узел, который я пытаюсь прочитать, это идентификатор ниже ProductionRequest.

Вот XML-файл, который я пытался прочитать:

<?xml version="1.0" encoding="iso-8859-1"?>
<ProductionSchedule xmlns="http://www.wbf.org/xml/b2mml-v02"> 
  <ID>00000020000000</ID>
  <Location>
   <EquipmentID>8283</EquipmentID>
   <EquipmentElementLevel>Site</EquipmentElementLevel>
  <Location>
   <EquipmentID>0</EquipmentID>
   <EquipmentElementLevel>Area</EquipmentElementLevel>
   </Location>
  </Location>
 <ProductionRequest>
    <ID>0009300000000</ID>
    <ProductProductionRuleID>W001</ProductProductionRuleID>
    <StartTime>2017-04-20T23:57:20</StartTime>
    <EndTime>2017-04-20T24:00:00</EndTime>
    </ProductionRequest>
  </ProductionSchedule>

Это код, который я использовал для чтениявыше XML

using System;
using System.Xml.Linq;
using System.Xml;
using System.Xml.XPath;

namespace XML
{
  class Program
  {
    static void Main(string[] args)
    {
     Console.WriteLine("Hello World!");
     string fullName = "F:\\Programming\\XML\\Example XML.xml";
     XmlDocument xreader = new XmlDocument();

     xreader.Load(fullName);
     XmlNode root = xreader.DocumentElement;
     XmlNodeList xnList1 = 
            xreader.SelectNodes("/ProductionSchedule/ProductionRequest/ID");


    }
  }
 }

Я не смог найти причину этой проблемы.Может ли кто-нибудь помочь мне в этом отношении.Ждем ценного вклада.

1 Ответ

0 голосов
/ 28 декабря 2018

XML содержит пространство имен http://www.wbf.org/xml/b2mml-v02 на узле корневого уровня <ProductionSchedule>

И вы используете /ProductionSchedule/ProductionRequest/ID такого рода XPath, но эти пути не подходят для этого XML, и поэтому вы не можетеполучить любое желаемое значение.

Вам нужно использовать ниже XPath, чтобы получить идентификаторы всех <ProductionRequest> узлов.

XmlNodeList xnList1 = xreader.SelectNodes("//*[name()='ProductionSchedule']/*[name()='ProductionRequest']/*[name()='ID']");

ИЛИ вы можете добавить пространство имен вручную, например

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xreader.NameTable);
nsmgr.AddNamespace("x", "http://www.wbf.org/xml/b2mml-v02");
XmlNodeList xnList1 = xreader.SelectNodes("//x:ProductionSchedule/x:ProductionRequest/x:ID", nsmgr);

И, наконец, вы можете прочитать id из любой переменной выше xnList1, например

foreach (XmlNode id in xnList1)
{
    Console.WriteLine(id.InnerText);
}

Вывод:

enter image description here

...