<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)获取属性值。
答案 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来读取和写入属性值,或者可能使用一些实用程序例程来自动将属性值传递给强大的 - 键入的数据对象。