2017-02-22 10 views
0

У меня есть довольно большой XML-файл с сеанса компьютерной диагностики, и моя цель - захватить данные результатов тестирования и вставить его в PDF-файл для клиента. У меня очень мало опыта работы с XML, и это становится огромной проблемой.Получение дочерних узлов в XML с пользовательским пространством имен

Вот образец документа:

<pcd:DiagLog xmlns="http://www.pc-doctor.com/2004/8/diagLogger" 
      xmlns:pcd="http://www.pc-doctor.com/2004/8/diagLogger" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.pc-doctor.com/2004/8/diagLogger 
      http://www.pc-doctor.com/2004/8/diagLogger/diagLogger.xsd"> 
    <Application> 
     <version>6.0.6818.10</version> 
     <Start> 
      <Time hour="04" minute="14" second="01" millisecond="34" month="10" day="15" year="2016" utcOffset="-480">2016-10-15T04:14:01.034-08:00</Time> 
     </Start> 
     <OS>Windows 10 Service Pack 0 PE x86 32-bit</OS> 
    </Application> 
     ....... 
    <DiagInfo> 
     .... 
     <TestResult EnglishResult="PASS"> 
       .... 
     </TestResult> 
    </DiagInfo> 

Есть тысячи строк между </Application> и <DiagInfo>, но я заинтересован только с информацией, находящейся в <DiagInfo> и <TestResult>.

Я думал, что я мог бы захватить Узлы просто:

XmlDocument doc = new XmlDocument(); 
    doc.Load(xmlFilePath); 
    XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 
    manager.AddNamespace("pcd", "http://www.pc-doctor.com/2004/8/diagLogger"); 
    XmlNodeList xnList = doc.SelectNodes("/pcd:DiagLog/DiagInfo", manager); 

Но это возвращает пустой список. Когда я ссылаюсь на Namespace Manager or XsltContext needed, появляется Я делаю это правильно, но я не думаю, что я правильно понимаю пространство имен. Когда я изменяю Корневой элемент только: <Diagnostics></Diagnostics> вместо <pcd:DiagLog>, и попробуйте: doc.SelectNodes("/Diagnostics/DiagInfo", manager); список моих узлов заселен.

Может ли кто-нибудь увидеть, где я навожу пространство имен?

+0

@Tomalak это ошибка при копировании/вставке. Я проверил код и соответствие URI .. –

ответ

1

Вам необходимо использовать префикс пространства имен для всех узлов этого пространства имен.

Это неправильное: /pcd:DiagLog/DiagInfo.

Это правильно: /pcd:DiagLog/pcd:DiagInfo.

+0

Yup. Вот и все. Я еще не могу отметить ответ, но это сработало. –

+1

Распространяется пространство имен по умолчанию. Явных пространств имен нет. Ваш XML использует пространство имен по умолчанию. Строго говоря, если ни один узел вашего входного XML не использует префикс 'pcd', вы можете выбросить эту декларацию пространства имен без каких-либо негативных последствий. Вам также не требуется называть это пространство имен 'pcd' в C#. Вы можете дать ему любой дескриптор, который вам нужен, только URI должны совпадать. – Tomalak