我有一个非常简单的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
我已经尝试了一些变体,但我似乎无法将版本打印到我的控制台。
答案 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