我试图转移到xml元素中的另一个属性,但这样做没有太多运气。
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<finances>
<financial no="0" id="431" rowID="0" ddlValue="Return" ddlNote="Post Dated" ddBranch="" ddType="" />
</finances>
代码:
Dim child = 0
child = childRow.RowIndex
Dim hidden = CType(gvChild.DataKeys(child)("id"), Integer)
For Each node As XmlNode In doc.SelectNodes("//financial/@id")
If node.Value = hidden.ToString Then
If Not doc.SelectSingleNode("//financial/@ddlNote").InnerText.Equals("") Then
LblErr.Text = doc.SelectSingleNode("//financial/@ddlNote").InnerText
End If
End If
Next
基本上,当id等于我的表单上的内容时,我希望它移动到ddlNote属性并显示它的值。它触发第一个if语句,当它与表单上的id匹配时,它移动到内部if语句,但内部if语句不会触发。我将如何移动到该属性(看到我从id属性开始,我将如何移动到ddlNote)?
答案 0 :(得分:1)
您的答案是if
语句上方的一行,不会触发。您的xpath正在选择属性,因此在第一个if
中,您需要选择属性的值。只需在第二个if
上重复它,然后选择值而不是内部文本:
If node.Value = hidden.ToString Then
If Not doc.SelectSingleNode("//financial/@ddlNote").Value.Equals("") Then
LblErr.Text = doc.SelectSingleNode("//financial/@ddlNote").Value
End If
End If
...但我会改变你的方法,首先是因为你可以为if
和第二个使用一个节点因为你的实际代码,如果XML有多个节点,你将总是得到ddlNote属性为第一个属性,如果它不是空白。所以我会做这样的事情:
For Each node As XmlNode In doc.SelectNodes("//financial")
If node.Attributes("id").Value = hidden.ToString Then
If Not node.Attributes("ddlNote").Value.Equals("") Then
LblErr.Text = node.Attributes("ddlNote").Value
End If
End If
Next
您只需要读取一次节点,然后按名称访问它的属性。请记住使用value
属性,因为innerText
获取节点和子节点的全文。
编辑:更短:
For Each node As XmlNode In doc.SelectNodes(String.Format("//financial[@id={0}]", hidden.ToString)
If Not node.Attributes("ddlNote").Value.Equals("") Then
LblErr.Text = node.Attributes("ddlNote").Value
End If
Next
您可以使用XPath直接选择具有您正在搜索的属性值的节点。