使用F#从XML中选择单节点值

时间:2015-11-30 17:39:12

标签: xml f#

我有一个非常简单的xml文件:

<?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 个答案:

答案 0 :(得分:1)

以下似乎有效 - 我在XPath中添加了ns:前缀,并将XML命名空间管理器添加为另一个参数。我还更改了代码以访问XML元素的InnerText而不是Value

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