Невозможно найти способ получить дочерний узел из XMLNodeList по тексту

Это меня убивает, у меня есть XMLDocument, и мне нужно получить текстовое значение определенных узлов, но все, что я пробую, терпит неудачу. Учитывая приведенный ниже XML-документ, мне нужно получить такие вещи, как идентификатор пациента, фамилия и т. Д.

<Message xmlns="http://" version="010" release="006">
<Header>
    <To Qualifier="C">1306841101</To>
    <From Qualifier="P">8899922</From>
</Header>
<Body>
    <RxFill>
        <Patient>
            <Identification>
      <ID>193306093523</ID>
      <ID3>111223333</ID3>
            </Identification>
            <Name>
                <LastName>Smith</LastName>
                <FirstName>Jane</FirstName>
            </Name>
        </Patient>
    </RxFill>
</Body>

I can get the actual NodeList of 'Patient' like so:

XmlNode root = oDoc.DocumentElement; 
oDoc.GetElementsByTagName("Patient")

но тогда я застрял, если я затем попытаюсь получить дочерний узел, xpath никогда их не найдет.

Например:

oDoc.GetElementsByTagName("Patient")[0].SelectSingleNode("Identification")

появляется null, хотя я вижу в отладчике, что «Идентификация» - это FirstChild. Я также добавил косую черту: «// Идентификация» и никакой радости.

Однако я могу добраться до него из документа:

oDoc.GetElementsByTagName("Identification")

но это не сработает, потому что у меня могут быть другие подобные теги в документе; Мне нужен только идентификационный ярлык, принадлежащий пациенту.

Я пробовал перебрать всех детей, чтобы найти их, но это кажется очень неэффективным.

Любые идеи?


person user197505    schedule 14.08.2019    source источник


Ответы (1)


Вы должны включить пространство имен в XPath. Вы можете сделать это с помощью XmlNamespaceManager:

XmlNode root = oDoc.DocumentElement;
XmlNode patient = oDoc.GetElementsByTagName("Patient")[0];

XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable());
nsm.AddNamespace("ns", "http://");

XmlNode identification = patient.SelectSingleNode("ns:Identification", nsm);
string id = identification.SelectSingleNode("ns:ID", nsm).InnerText;
person mm8    schedule 14.08.2019
comment
Блин, спасибо. Думаю, мне нужно выяснить, почему пространства имен влияют на xpath :() - person user197505; 14.08.2019