SORU
24 AĞUSTOS 2011, ÇARŞAMBA


Neden XmlNamespaceManager gerekli mi?

Gelince biraz kuru buldumnedenen azından .Net Çerçeve -- XPath sorguları gerçekleştirirken ad (ya da her neyse oldukça aksak ve ayrıntılı [local-name()=... XPath yüklem/işlev/) işlemek için XmlNamespaceManager bir kullanım için gereklidir. Benyapınad gerekli ya da en azından yararlı olduğunu anlamak, amanedenbu kadar karmaşık?

Basit bir XML Belgesi (no ad) sorgulamak için...

<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode>
   <nodeName>Some Text Here</nodeName>
</rootNode>

...bir doc.SelectSingleNode("//nodeName") gibi bir şey <nodeName>Some Text Here</nodeName> maç hangi () kullanabilirsiniz

Gizem #1:Benim ilk sıkıntıEğer doğru anladıysam -- sadece ana/kök etiketi alt düğüm bir etiket parçası olarak kullanılan ya da bir ad için bir başvuru gibi eklemek:

<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns="http://someplace.org">
   <nodeName>Some Text Here</nodeName>
</rootNode>

...kod birkaç ekstra satırları aynı sonucu elde etmek için gereklidir:

Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("ab", "http://s omeplace.org")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//ab:nodeName", nsmgr)

...aslında var olmayan bir önek üretmekteyim ("ab") bile bir önek kullanmayan bir düğüm bulmak için.Nasıl bu mantıklı mı?(Kavramsal olarak) doc.SelectSingleNode("//nodeName") nesi var?

Sır #2Yani, önekleri kullanan bir XML belgesi var dediler

<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns:cde="http://someplace.org" xmlns:feg="http://otherplace.net">
   <cde:nodeName>Some Text Here</cde:nodeName>
   <feg:nodeName>Some Other Value</feg:nodeName>
   <feg:otherName>Yet Another Value</feg:otherName>
</rootNode>

... Eğer doğru anladıysam, her iki ad eklemek gerekir tek bir düğüm için bir sorgu yapmak için XmlNamespaceManager,...

Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("cde", "http://someplace.org")
nsmgr.AddNamespace("feg", "http://otherplace.net")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//feg:nodeName", nsmgr)

... Neden, bu durumda, (kavramsal olarak) ad yöneticisi ihtiyacım var mı?

**** Aşağıda yorumlar kısmına DÜZENLENMİŞ

Edit Eklendi: Benim gözden geçirilmiş ve rafine soru temel üzerine belirgin bir fazlalık XmlNamespaceManager içinde ne olduklarına birçoğu ve kullanımı ad yöneticisi belirlemek için haritalama önek için URI:

Ad doğrudan öneki eşleme ("") cde ad alanı URI ("") http://someplace.org açıkça kaynak belgede belirtilmiştir:

...<rootNode xmlns:cde="http://someplace.org"...

bir programcı bir sorgu yapmadan önce bu eşleme yeniden kavramsal ihtiyacı nedir?

CEVAP
27 EKİM 2011, PERŞEMBE


Temel nokta olarak dikkat çekti Kev, above), URI ad önemli parçası ad yerine ad önek, önek bir "keyfi kolaylık"

Ad yöneticisi neden ihtiyacın gelince, orada belgeyi kullanarak işe yarar bazı sihirli olmak yerine, iki tane nedeni olabilir.

Neden 1

Eğer sadece örnek olarak documentElement için ad alanı bildirimi eklemek için izin verilmiş olsaydı, gerçekten selectSingleNode tanımlanan her ne ise sadece kullanmak için önemsiz olacaktır.

Ancak, bir belge içinde herhangi bir öğe ad alanı önekleri tanımlayabilirsiniz ve ad alanı önekleri benzersiz bir belge içinde herhangi bir ad alanına bağlı değildir. Aşağıdaki örneği ele alalım

<w xmlns:a="mynamespace">
  <a:x>
    <y xmlns:a="myOthernamespace">
      <z xmlns="mynamespace">
      <b:z xmlns:b="mynamespace">
      <z xmlns="myOthernamespace">
      <b:z xmlns:b="myOthernamespace">
    </y>
  </a:x>
</w>

Bu örnekte, //z, //a:z //b:z iade etmek istediğiniz? Nasıl, dış ad yöneticisi gibi bir şey olmadan, ifade eder misin?

Neden 2

Kullandığınız ad önekleri hakkında hiçbir şey bilmek gerek kalmadan herhangi bir eşdeğer belge için aynı XPath ifadesi yeniden kullanmak için izin verir.

myXPathExpression = "//z:y"
doc1.selectSingleNode(myXPathExpression);
doc2.selectSingleNode(myXPathExpression);

doc1:

<x>
  <z:y xmlns:z="mynamespace" />
</x>

Için doc2:

<x xmlns"mynamespace">
  <y>
</x>

Ad yöneticisi olmadan bu ikinci amaca ulaşmak için, her belge incelemek için, her biri için özel bir XPath ifadesi binası olurdu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • graham025

    graham025

    25 NİSAN 2006
  • RocketJump

    RocketJump

    22 ŞUBAT 2006
  • ThreadBanger

    ThreadBanger

    2 Mart 2007