Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用F#搜索元素,然后添加同级节点_F#_Xml Parsing_Linq To Xml - Fatal编程技术网

使用F#搜索元素,然后添加同级节点

使用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

我正在尝试使用F#,用于我需要运行的一个实用程序作业

从包含xml配置文件的目录中,我希望识别包含特定节点的所有文件,并查找属性,在找到匹配项时,我希望在同一文件中插入同级节点。 我已经编写了识别所有文件的代码段,现在我有了一个文件序列,我想迭代并搜索属性,如果需要,还可以追加

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""/>")))