代码之家  ›  专栏  ›  技术社区  ›  Cainnech

XML SelectSingleNode命名空间问题

  •  0
  • Cainnech  · 技术社区  · 6 年前

    我试图使用SelectSingleNode从XML中获取单个值,但它一直返回null。

    我一直在看,所以它似乎与名称空间有关。我试图添加它,但我一直得到空。

    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 回复  |  直到 6 年前
        1
  •  0
  •   Hassan Voyeau    6 年前

    测试了这个,你错过了关闭 </EML> 标签。这就是我犯的错误

    未处理的异常:System.Xml.XmlException异常:出现意外的文件结尾。以下元素未关闭:EML。第24行,位置17。

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

    输入.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>
    
        2
  •  0
  •   Nhan Phan    6 年前

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

    1. xml文件中缺少close节点:
    2. 如果您的内容包含上述xml的信息,那么您可以使用 文档加载XML(内容) ,否则应使用 文件加载(文件名)。

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