Por que o XmlNamespaceManager é necessário?
Eu vim meio seco quanto aporqu - pelo menos no .Net Framework - é necessário usar umXmlNamespaceManager
para lidar com namespaces (ou o mais desajeitado e detalhado[local-name()=...
Predicado / função / o que for XPath) ao executar consultas XPath. EUFa entender por que os namespaces são necessários ou pelo menos benéficos, masporqu é tão complexo?
Para consultar um documento XML simples (sem espaços para nome) ...
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode>
<nodeName>Some Text Here</nodeName>
</rootNode>
... pode-se usar algo comodoc.SelectSingleNode("//nodeName")
(que corresponderia a<nodeName>Some Text Here</nodeName>
)
Mystery # 1: Meu primeiro aborrecimento - Se bem entendi - é apenas adicionar uma referência de espaço para nome à marca pai / raiz (usada como parte de uma marca de nó filho ou não) assim:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns="http://someplace.org">
<nodeName>Some Text Here</nodeName>
</rootNode>
... requer várias linhas de código extras para obter o mesmo resultado:
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("ab", "http://s+omeplace.org")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//ab:nodeName", nsmgr)
... basicamente sonhando com um prefixo inexistente ("ab
") para encontrar um nó que nem usa um prefixo.Como isso faz sentido O que há de errado (conceitualmente) comdoc.SelectSingleNode("//nodeName")
?
Mystery # 2: Então, digamos que você tenha um documento XML que use prefixos:
<?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>
... Se bem entendi, você teria que adicionar os dois namespaces aoXmlNamespaceManager
, para fazer uma consulta para um único nó ...
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)
... Por que, nesse caso, preciso (conceitualmente) de um gerenciador de namespac
** REVISADO nos comentários abaixo **
Edit Adicionado: Minha pergunta revisada e refinada é baseada na aparente redundância do XmlNamespaceManager no que acredito ser a maioria dos casos e no uso do gerenciador de namespace para especificar um mapeamento de prefixo para URI:
Quando o mapeamento direto do prefixo do espaço para nome ("cde") para o URI do espaço para nome ("http://someplace.org") é explicitamente declarado no documento de origem:
...<rootNode xmlns:cde="http://someplace.org"...
ual é a necessidade conceitual de um programador recriar esse mapeamento antes de fazer uma consult