XmlDocument и получение определенных атрибутов с помощью xPath - PullRequest
3 голосов
/ 05 июля 2011

Я видел несколько примеров здесь, где Xpath используется вместе с XmlDocument для получения определенного атрибута из узла XmlDocument .... Пример

Console.WriteLine(xmlDocument.SelectSingleNode("//dataTemplateSpecification/templates/template/elements/element/@name").Value.ToString());

По какой-то причине я получаю «Ссылка на объект не установлена ​​на экземпляр объекта». исключение. Всякий раз, когда я сталкиваюсь с этой конкретной строкой кода. У меня есть небольшое тестовое приложение, которое я настроил для тестирования разных вещей, прежде чем я положу их в свой основной проект ...

Вот код для этого ...

namespace ReadXml
{
    class Program
    {
        static void Main(string[] args)
        {
            //string fulXmlPath =     System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/templateExample.xml");
            XDocument xDocument = XDocument.Load("C:\\Users\\derekww\\Documents\\XML Documents\\templateExample.xml");
            XElement elem = xDocument.Element("dataTemplateSpecification"); ;
            XmlDocument xmlDocument = new XmlDocument();
            StreamReader file = new StreamReader("C:\\Users\\derekww\\Documents\\XML Documents\\templateExample.xml");

            xmlDocument.Load(file);

            //XmlDocument theDoc = new XmlDocument();
            //using (var xmlReader = xDocument.CreateReader())
            //{
            //    xmlDocument.Load(xmlReader);
            //}

            //Console.WriteLine(elem.ToString());
            XmlNode xNode = xmlDocument.SelectSingleNode("//dataTemplateSpecification/templates/template/elements/element");
            Console.WriteLine("WORK PLEASE!!!! {0}", xNode.Value.ToString());
            //Console.WriteLine(xmlDocument.SelectSingleNode("//dataTemplateSpecification/templates/template/elements/element/@name").Value.ToString());
            //Console.WriteLine("This better Work>>>> {0}", xmlDocument.Attributes["/dataTemplateSpecification/templates/template/elements/element/@name"].Value);
            Console.ReadLine();
            //Console.WriteLine("This better Work>>>> {0}", xmlDocument.SelectSingleNode("//dataTemplateSpecification/templates/template/elements/element/@name").Value);
            //foreach (String AttVal in xmlDocument.SelectSingleNode("//dataTemplateSpecification/templates/template/elements/element/@name").Value)
            {
                //Console.WriteLine("This better Work>>>> {0}", AttVal);
            }
        }
    }
}

Вот часть XML, которую я использовал ...

    <?xml version="1.0" encoding="utf-8"?>
    <dataTemplateSpecification id="id1" name="name1" xmlns="http://EADIS.upmc.com      /DataTemplateSpecification.xsd">
      <description xmlns="">
        <html>text</html>
      </description>
      <templates xmlns="">
        <template>
          <elements>
            <element id="element0" name="PatientId" display="Patient ID"  dataType="String" value="0101010111111" visable="false" readOnly="true">
              <validation>
                <rules>
                  <rule id="0" test="#element0.value == ''">
                    <fail>
                      <html><b>Patient ID is null, value must be present</b></html>
                    </fail>
                  </rule>
                </rules>
              </validation>
            </element>
           </elements>
          </template>
         <templates>

Я только что показал вам ту часть, которая вам нужна для понимания структуры xml. Уверяю вас, это хорошо сформировано. Я думаю, что задавал этот вопрос раньше, но так или иначе он не был опубликован (возможно, я забыл, кто знает). Любая помощь с этим будет принята с благодарностью. Если я найду причину, по которой это не работает, я обязательно сообщу вам, ребята.

Спасибо.

Ответы [ 2 ]

7 голосов
/ 05 июля 2011

Почему вы не можете использовать это XPath:

xmlDocument.SelectSingleNode("//templates/template/elements/element/@name").Value
1 голос
/ 05 июля 2011

Вам необходимо указать пространство имен файла XML в вашем коде.
Подробнее см. Здесь: Как выбрать корневой узел xml, когда корневой узел имеет атрибут?

...