XML SelectSingleNode Namespacing问题

时间:2018-10-05 01:31:17

标签: c# xml xml-namespaces

我正在尝试使用SelectSingleNode从XML获取单个值,但是它一直在向我返回null。

我一直在这里查看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 :(得分:0)

对此进行了测试,您找不到关闭的</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>

答案 1 :(得分:0)

您的代码看起来不错,除了:

  1. 您错过了xml文件中的关闭节点:“”
  2. 如果您的内容包含上述xml的信息,则可以使用 doc.LoadXML(content),否则应使用 doc.Load(fileName)。 < / li>

您的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);
            }