2015-11-30 4 views
0

У меня есть очень простой XML-файл:Выберите Single Значение узла из XML с помощью F #

<?xml version="1.0" encoding="utf-8"?> 
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> 
    <metadata> 
     <id>SomeSoftware</id> 
     <title>Some Software</title> 
     <version>1.2.3</version> 
    </metadata> 
</package> 

Из этого файла я хотел бы, чтобы извлечь значение версии узла, используя F #.

let xmlDocument = new XmlDocument() 
let namespaces = new XmlNamespaceManager(xmlDocument.NameTable); 
namespaces.AddNamespace("ns", "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"); 
xmlDocument.Load "software.nuspec" 

let node = xmlDocument.SelectSingleNode "/package/metadata/version" :?> XmlElement 
if node = null then 
    printfn "unable to find version" 
else 
    printfn "%s" node.Value 

Я пробовал несколько вариантов этого, но, похоже, я не могу распечатать версию на своей консоли.

ответ

1

Следующее, кажется, работает - я добавил префикс ns: в XPath, а также добавил диспетчер пространства имен XML в качестве другого аргумента. Я также изменил свой код доступа InnerText, а не Value из XML-элементов:

let node = 
    xmlDocument.SelectSingleNode 
    ("/ns:package/ns:metadata/ns:version", namespaces) :?> XmlElement 
if node = null then 
    printfn "unable to find version" 
else 
    printfn "%s" node.InnerText 

Хотя, если вы хотите, чтобы сделать это лучше, вы могли бы использовать XML type provider from F# Data, что делает его гораздо лучше - если software.nuspec в ток справочник, вы можете написать:

type NuSpec = XmlProvider<"software.nuspec"> 
NuSpec.Load("software.nuspec").Metadata.Version 
+0

Было бы просто предложить вам добавить поставщика XML-типа в качестве дополнительного предложения для вашего ответа. Для любых более сложных случаев это, безусловно, сделает жизнь OP намного легче. – TheInnerLight

+0

Поставщик типа xml довольно хорош, я пошел на это. – ilivewithian

Смежные вопросы