Проблема XML SelectSingleNode Namespace - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь получить одно значение из XML, используя SelectSingleNode, но он продолжает возвращать нулевое значение для меня.

Я искал здесь на SO, и, похоже, это как-то связано спространство имен.Я пытался добавить его, но получаю ноль.

XML выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<EML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xnl="urn:oasis:names:tc:ciq:xnl:4" 
     xmlns:xal="urn:oasis:names:tc:ciq:xal:4" 
     xmlns="urn:oasis:names:tc:evs:schema:eml" 
     xmlns:martine="http://www.martine.be/extensions"
     Id="510" 
     SchemaVersion="7.0" 
     xsi:schemaLocation="urn:oasis:names:tc:evs:schema:eml schema/510-count-v7-0.xsd
            http://www.martine.be/extensions schema/martine-eml-extensions.xsd">


    <EMLHeader>
        <TransactionId>01</TransactionId>
        <ManagingAuthority>                                                         
            <AuthorityIdentifier>2</AuthorityIdentifier>
            <AuthorityName>
                <NameElement ElementType="">VLR</NameElement>
            </AuthorityName>            
            <Description>Some Description</Description>
            <OrganizationURL>Unknown</OrganizationURL>
            <AuthorityAddress/>     
        </ManagingAuthority>
    </EMLHeader>

Я пытаюсь извлечь описание, используя следующий код:

XmlDocument doc = new XmlDocument();            
doc.LoadXml(content);

var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ns", "urn:oasis:names:tc:evs:schema:eml");

XmlNode testNode = doc.SelectSingleNode("/ns:EML/ns:EMLHeader/ns:ManagingAuthority/ns:Description", nsmgr);
if (testNode != null)
{
   Console.WriteLine(testNode.InnerText);
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Ваш код выглядит нормально, за исключением:

  1. вы пропустили закрытие узла в файле XML: ""
  2. , если ваш контент содержит информацию вышеxml, тогда вы можете использовать doc.LoadXML (content) , в противном случае вам следует использовать doc.Load (fileName).

Ваш xml-файл должен быть:

<?xml version="1.0" encoding="UTF-8"?>
<EML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xnl="urn:oasis:names:tc:ciq:xnl:4"
     xmlns:xal="urn:oasis:names:tc:ciq:xal:4"
     xmlns="urn:oasis:names:tc:evs:schema:eml"
     xmlns:martine="http://www.martine.be/extensions"
     Id="510"
     SchemaVersion="7.0"
     xsi:schemaLocation="urn:oasis:names:tc:evs:schema:eml schema/510-count-v7-0.xsd
            http://www.martine.be/extensions schema/martine-eml-extensions.xsd">


  <EMLHeader>
    <TransactionId>01</TransactionId>
    <ManagingAuthority>
      <AuthorityIdentifier>2</AuthorityIdentifier>
      <AuthorityName>
        <NameElement ElementType="">VLR</NameElement>
      </AuthorityName>
      <Description>Some Description</Description>
      <OrganizationURL>Unknown</OrganizationURL>
      <AuthorityAddress/>
    </ManagingAuthority>
  </EMLHeader>
</EML>

И тогда вы можете прочитать это:

            XmlDocument doc = new XmlDocument();
            doc.Load(fileName);

            var nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("ns", "urn:oasis:names:tc:evs:schema:eml");

            XmlNode testNode = doc.SelectSingleNode("/ns:EML/ns:EMLHeader/ns:ManagingAuthority/ns:Description", nsmgr);
            if (testNode != null)
            {
                Console.WriteLine(testNode.InnerText);
            }
0 голосов
/ 05 октября 2018

Протестировано, и у вас нет закрывающего тега </EML>.Это была ошибка, которую я получил

Необработанное исключение: System.Xml.XmlException: неожиданный конец файла.Следующие элементы не закрыты: EML.Строка 24, позиция 17.

TestCodeApp.cs

using System;
using System.Xml;

public class Program
{
    public static void Main()
    {
        XmlDocument doc = new XmlDocument();            
        doc.Load("input.xml");

        var nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace("ns", "urn:oasis:names:tc:evs:schema:eml");

        XmlNode testNode = doc.SelectSingleNode("/ns:EML/ns:EMLHeader/ns:ManagingAuthority/ns:Description", nsmgr);
        if (testNode != null)
        {
            Console.WriteLine(testNode.InnerText);
        }
    }
}

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<EML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xnl="urn:oasis:names:tc:ciq:xnl:4" 
     xmlns:xal="urn:oasis:names:tc:ciq:xal:4" 
     xmlns="urn:oasis:names:tc:evs:schema:eml" 
     xmlns:martine="http://www.martine.be/extensions"
     Id="510" 
     SchemaVersion="7.0" 
     xsi:schemaLocation="urn:oasis:names:tc:evs:schema:eml schema/510-count-v7-0.xsd
            http://www.martine.be/extensions schema/martine-eml-extensions.xsd">


    <EMLHeader>
        <TransactionId>01</TransactionId>
        <ManagingAuthority>                                                         
            <AuthorityIdentifier>2</AuthorityIdentifier>
            <AuthorityName>
                <NameElement ElementType="">VLR</NameElement>
            </AuthorityName>            
            <Description>Some Description</Description>
            <OrganizationURL>Unknown</OrganizationURL>
            <AuthorityAddress/>     
        </ManagingAuthority>
    </EMLHeader>
</EML>
...