使用F#搜索元素,然后添加同级节点
我正在尝试使用F#,用于我需要运行的一个实用程序作业 从包含xml配置文件的目录中,我希望识别包含特定节点的所有文件,并查找属性,在找到匹配项时,我希望在同一文件中插入同级节点。 我已经编写了识别所有文件的代码段,现在我有了一个文件序列,我想迭代并搜索属性,如果需要,还可以追加使用F#搜索元素,然后添加同级节点,f#,xml-parsing,linq-to-xml,F#,Xml Parsing,Linq To Xml,我正在尝试使用F#,用于我需要运行的一个实用程序作业 从包含xml配置文件的目录中,我希望识别包含特定节点的所有文件,并查找属性,在找到匹配项时,我希望在同一文件中插入同级节点。 我已经编写了识别所有文件的代码段,现在我有了一个文件序列,我想迭代并搜索属性,如果需要,还可以追加 open System.Xml.Linq let byElementName elementToSearch = XName.Get(elementToSearch) let xmlDoc = XDocument.L
open System.Xml.Linq
let byElementName elementToSearch = XName.Get(elementToSearch)
let xmlDoc = XDocument.Load(@"C:\\Some.xml")
xmlDoc.Descendants <| byElementName "Elem"
|> Seq.collect(fun(riskElem) -> riskElem.Attributes <| byElementName "type" )
|> Seq.filter(fun(pvAttrib) -> pvAttrib.Value = "abc")
|> Seq.map(fun(pvAttrib) -> pvAttrib.Parent)
|> Seq.iter(printfn "%A")
结果XML:
您的函数可以正确地从文件中找到
元素,但不会打印任何内容。您正在打印的elem.Value
属性引用元素的主体,在您的示例中该主体为空。如果使用以下输入,则会打印“一”和“二”:
如果您想选择一个特定的元素(具有某些指定的属性),然后在找到该元素时执行某些操作,您可能可以使用Seq.tryPick
函数,但这将是一个单独的问题。您的函数可以正确地从文件中找到Elem
元素,但它不会打印任何内容。您正在打印的elem.Value
属性引用元素的主体,在您的示例中该主体为空。如果使用以下输入,则会打印“一”和“二”:
如果您想选择一个特定的元素(具有某些指定的属性),然后在找到该元素时执行某些操作,您可能可以使用Seq.tryPick
函数,但这将是一个单独的问题。在我看来,复杂的LINQ到XML查询很笨拙,最好使用XPath:
open System.Xml.Linq
open System.Xml.XPath
xmlDoc.XPathEvaluate("//Elem[@type='abc']") :?> _
|> Seq.cast<XElement>
|> Seq.iter (fun el ->
el.AddAfterSelf(XElement.Parse(@"<Elem type=""abc2"" methodology=""abcmeth""/>")))
opensystem.Xml.Linq
open System.Xml.XPath
xmlDoc.xpatheevalue(“//Elem[@type='abc']):?>_
|>序号
|>序号:iter(乐趣el->
el.AddAfterSelf(XElement.Parse(@“”))
XML文档:
在我看来,复杂的LINQ到XML查询很笨拙,最好使用XPath:
open System.Xml.Linq
open System.Xml.XPath
xmlDoc.XPathEvaluate("//Elem[@type='abc']") :?> _
|> Seq.cast<XElement>
|> Seq.iter (fun el ->
el.AddAfterSelf(XElement.Parse(@"<Elem type=""abc2"" methodology=""abcmeth""/>")))
opensystem.Xml.Linq
open System.Xml.XPath
xmlDoc.xpatheevalue(“//Elem[@type='abc']):?>_
|>序号
|>序号:iter(乐趣el->
el.AddAfterSelf(XElement.Parse(@“”))
XML文档:
您忘了一些结束标记了吗?xml文件格式不正确。xml将继续使用类似的标记。。将立即编辑问题您是否忘记了一些结束标记?xml文件格式不正确。xml将继续使用类似的标记。。现在将编辑问题谢谢Tomas!斯利,这个问题一开始并不清楚。printfn仅用于调试。我已经进一步更新了它。希望现在更清楚了。@Codex-我想你在找到正确的元素时遇到了麻烦。关于添加-到目前为止您尝试了什么?您找到XElement
()的Add
方法了吗?您希望得到什么样的XML作为结果?我已经更新了结果XML。对于添加节点,我尝试使用AddAfterSelf方法,但这似乎没有帮助。也没有编译错误。“让插入元素(elementToInsertAfter:XElement)=执行elementToInsert |>elementToInsertAfter.addafterf”谢谢Tomas!斯利,这个问题一开始并不清楚。printfn仅用于调试。我已经进一步更新了它。希望现在更清楚了。@Codex-我想你在找到正确的元素时遇到了麻烦。关于添加-到目前为止您尝试了什么?您找到XElement
()的Add
方法了吗?您希望得到什么样的XML作为结果?我已经更新了结果XML。对于添加节点,我尝试使用AddAfterSelf方法,但这似乎没有帮助。也没有编译错误。“让InsertElement(elementToInsertAfter:XElement)=执行elementToInsert |>elementToInsertAfter.addafterf”是的,这很有意义。谢谢是的,这是有道理的。谢谢
open System.Xml.Linq
open System.Xml.XPath
xmlDoc.XPathEvaluate("//Elem[@type='abc']") :?> _
|> Seq.cast<XElement>
|> Seq.iter (fun el ->
el.AddAfterSelf(XElement.Parse(@"<Elem type=""abc2"" methodology=""abcmeth""/>")))