按属性值选择XML节点

时间:2012-06-09 17:44:21

标签: .net xml f#

<location>
  <hotspot name="name1" X="444" Y="518" />
  <hotspot name="name2" X="542" Y="452" /> 
  <hotspot name="name3" X="356" Y="15" />
</location>

我有一个点变量,我需要选择带有坐标的节点,然后更改属性值。我想做类似的事情:

let node = xmld.SelectSingleNode("/location/hotspot[@X='542' @Y='452']")
node.Attributes.[0].Value <- "new_name2"

但是通过变量(variable_name.X / variable_name.Y)获取属性值。

5 个答案:

答案 0 :(得分:3)

我个人会使用LINQ to XML:

var doc = XDocument.Load(...);
var node = doc.Root
              .Elements("hotspot")
              .Single(h => (int) h.Attribute("X") == x &&
                           (int) h.Attribute("Y") == y);

请注意,如果可能没有匹配的元素,您应该使用SingleOrDefault;如果可能有多个匹配,则应使用First / FirstOrDefault

找到正确的hotspot节点后,您可以轻松设置属性:

node.SetAttributeValue("X", newX);
node.SetAttributeValue("Y", newY);

答案 1 :(得分:3)

真的很容易。假设我想修改节点中的第一个属性:

let node = xmld.SelectSingleNode("/location/hotspot[@X='" + string(current.X) + "'] [@Y='" + string(current.Y) + "']")
node.Attributes.[0].Value <- v

其中“current”是我的变量;)

答案 2 :(得分:2)

也许这样的事情会起作用:

// Tries to find the element corresponding to a specified point
let tryFindElementByPoint (xmlDoc : XmlDocument) point =
    let pointElement =
        point
        ||> sprintf "/location/hotspot[@X='%u' @Y='%u']"
        |> xmlDoc.SelectSingleNode

    match pointElement with
    | null -> None
    | x -> Some x

// Finds the element corresponding to a specified point, then updates an attribute value on the element.
let updatePointElement xmlDoc point (newValue : string) =
    match tryFindElementByPoint xmlDoc point with
    | None ->
        point ||> failwithf "Couldn't find the XML element for the point (%u, %u)."
    | Some node ->
        // TODO : Make sure this updates the correct attribute!
        node.Attributes.[0].Value <- newValue

答案 3 :(得分:2)

试试这个

//let node = xmld.SelectSingleNode("/location/hotspot[@X='542' and @Y='452']")
let query = sprintf "/location/hotspot[@X='%d' and @Y='%d']"
let node = xmld.SelectSingleNode(query 542 452)

答案 4 :(得分:0)

您不能使用XPath表达式一次填充多个变量。 XPath表达式返回的唯一值(或者,在技术层面上,由评估XPath表达式的SelectSingleNode返回)是由表达式标识的Xml节点。

一旦将<hotspot>元素作为节点对象,就必须使用DOM API来读取和写入属性值,或者可能使用一些实用程序例程来自动将属性值传递给强大的 - 键入的数据对象。