Powershell: XPath не може да избере, когато елементът има xmlns таг?

Имам много прост xml, както е показано по-долу:

<?xml version="1.0" encoding="utf-8"?>
<First>
  <Second>
    <Folder>today</Folder>
    <FileCount>10</FileCount>
  </Second>
  <Second>
    <Folder>tomorrow</Folder>
    <FileCount>90</FileCount>
  </Second>
  <Second>
    <Folder>yesterday</Folder>
    <FileCount>22</FileCount>
  </Second>
</First>

След това имам скрипт на powershell за избор на елемент "Папка":

[xml]$xml=Get-Content "D:\m.xml"
$xml.SelectNodes("//Folder")

Той извежда:

#text                                                                                                                                                                            
-----                                                                                                                                                                            
today                                                                                                                                                                            
tomorrow                                                                                                                                                                         
yesterday 

Няма проблем. Но ако променя xml файла, за да добавя "xmlns="http://schemas.microsoft.com/developer/msbuild/2003" към "First", както по-долу:

<?xml version="1.0" encoding="utf-8"?>
<First xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Second>
    <Folder>today</Folder>
    <FileCount>10</FileCount>
  </Second>
  <Second>
    <Folder>tomorrow</Folder>
    <FileCount>90</FileCount>
  </Second>
  <Second>
    <Folder>yesterday</Folder>
    <FileCount>22</FileCount>
  </Second>
</First>

След това моят скрипт на powershell не извежда нищо. Защо? Как да променя моя скрипт на powershell, за да поддържа този xmlns?

Благодаря много.


person vik santata    schedule 24.06.2015    source източник


Отговори (1)


Това, което добавихте, е именно пространство по подразбиране. За разлика от пространството на имената с префикс, наследствените елементи наследяват пространството на имената по подразбиране на предшественика неявно, освен ако не е посочено друго (използвайки изричен префикс или локално пространство на имена по подразбиране, което сочи към различен URI).

За да изберете елемент в пространството от имена, ще трябва да дефинирате префикс, който сочи към URI на пространството от имена, и да използвате правилно този префикс във вашия XPath, например:

$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("d", $xml.DocumentElement.NamespaceURI)
$xml.SelectNodes("//d:Folder", $ns)
person har07    schedule 24.06.2015
comment
Благодаря, но изглежда (1) Създайте ns, за да добавите d (2) Използвайте d-----е малко излишно за мен. Защо трябва да се занимавам да избирам //d:Folder, докато се уверявам, че $ns съдържа d? Не намирам нищо необходимо тук. Освен това името на пространството от имена по подразбиране е произволно избрано, не виждам стойността на съществуването му. Има много по-сложни сценарии, че това е необходимо, за да се каже някаква разлика? Бихте ли любезно дали пример? - person vik santata; 24.06.2015
comment
Всъщност префиксът d е произволно избран, какъв е URI адресът, към който сочи, и тази информация, пренасяна от $ns. Това означава, че имате нужда от двете стъпки (1) и (2) - person har07; 24.06.2015
comment
Само за да избегнем объркване, не именното пространство по подразбиране е произволно избрано, произволно е префиксът, който ще се използва в XPath. Префиксът може да бъде всичко, грубо казано, стига да сочи към URI на пространството от имена по подразбиране - person har07; 24.06.2015
comment
Благодаря, но бих могъл да се сетя, че ако аз внедрявам XML стандарт, бих считал пространството на имената по подразбиране като , тогава използването на празен префикс е ОК. Със сигурност моето предположение е невярно, но защо не може да бъде така? Искам да кажа, има ли сложни ситуации, при които винаги се нуждаем от произволно избран низ, за ​​да представим пространството на имената по подразбиране, или в противен случай ще имаме логически конфликти? - person vik santata; 24.06.2015
comment
Подобно поведение на XML парсера между езиците - може би не всички, но много от тях, които познавам - се дължи на спецификацията на XPath - Прочетох това някъде, може би грешно; корекциите са добре дошли-. В XPath всички елементи без префикс са обвързани с празно пространство от имена, докато в XML елементите без пространство от имена могат да бъдат в пространство от имена по подразбиране. Както и да е, опасявам се, че не знам защо XPath е проектирал точно по този начин - person har07; 24.06.2015
comment
@viksantata намери официална спецификация на XPath за име на елемент без префикс в XPath, считано за пространство от имена null: stackoverflow.com/a/ 22349809/2998271 - person har07; 27.06.2015
comment
Тъй като този отговор решава въпросния проблем, моля, помислете дали да не приемете това като отговор: meta.stackexchange.com/questions/5234/ - person har07; 27.06.2015