2
<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)获取属性值。

4

5 回答 5

4

我个人会使用 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);
于 2012-06-09T18:02:24.663 回答
3

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

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

其中“当前”是我的变量;)

于 2012-06-10T22:01:11.863 回答
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
于 2012-06-09T20:00:04.313 回答
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)
于 2012-06-10T13:29:31.983 回答
0

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

一旦将<hotspot>元素作为节点对象,您将不得不使用 DOM API 来读取和写入属性值,或者可能使用一些实用程序例程来自动将属性值传入和传出强类型数据对象。

于 2012-06-09T18:04:30.930 回答