XPath ASP.NET 2.0 XmlDataSource не поддерживает пространства имен

Я пытаюсь отобразить содержимое файла sitemap.xml, используя asp:Repeater и asp: XmlDataSource (см. Стандарт, определенный в http://www.sitemaps.org/protocol.php).

Проблема в том, что связующее <%#XPath("myNodeName")%> не может работать, когда исходный XML-документ содержит пользовательские пространства имен (как того требует стандарт, описывающий формат sitemap.xml).

Скотт Хансельман предлагает использовать пользовательский XmlNamespaceManager, но я не могу правильно его инициализировать, поэтому <%#XPath("myNodeName")%> не отображает значения в XML.

Обратите внимание, что при удалении пространств имен из XML следующий пример корректно работает!

Исходный XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<urlset
      xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
            http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
 <url>
  <loc>http://www.firebenchmarks.com/Modules/ContentItems/Public/ContentItems_View.aspx?RCICode=rci_001</loc>
  <changefreq>weekly</changefreq>
  <priority>1.00</priority>
 </url>
 <url>
  <loc>http://www.firebenchmarks.com/Modules/ProductCustomer/Public/ProductCustomer_Descriptor.aspx</loc>

  <changefreq>weekly</changefreq>
  <priority>0.90</priority>
 </url>
 <url>
  <loc>http://www.firebenchmarks.com/Modules/ContentItems/Public/ContentItems_View.aspx?RCICode=rci_633765577264687500</loc>
  <changefreq>weekly</changefreq>
  <priority>0.80</priority>

 </url>
</urlset>

ASPX (обратите внимание на NsMan, используемый внутри подшивки XPath):

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="XmlDataSource1">
    <ItemTemplate>
        <div>
            Loc: <asp:TextBox ID="LocTB" runat="server" Text='<%#XPath("loc",NsMan)%>' />
            Change frequency: <asp:TextBox ID="ChangeFrequencyTB" runat="server" Text='<%#XPath("changefreq",NsMan)%>' />
            Priority: <asp:TextBox ID="PriorityTB" runat="server" Text='<%#XPath("priority",NsMan)%>' />
        </div>
    </ItemTemplate>
</asp:Repeater>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/SiteMap.xml" ></asp:XmlDataSource>

Код, который инициализирует свойство NsMan, используемое механизмом связывания XPath внутри ASPX (именно здесь, скорее всего, и содержится ошибка):

 public XmlNamespaceManager NsMan
    {
        get 
        {
            if (_lazyNsMan == null)
            {
                NameTable table = new NameTable();               
                _lazyNsMan = new XmlNamespaceManager(table);
                _lazyNsMan.AddNamespace("", "http://www.sitemaps.org/schemas/sitemap/0.9");
                _lazyNsMan.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");                
                _lazyNsMan.AddNamespace("xsi:schemaLocation", "http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd");                
            }

            return _lazyNsMan;
        }
    }

0 ответов

Другие вопросы по тегам