移动到XML String中的新属性

时间:2014-11-27 16:10:13

标签: xml vb.net xml-parsing

我试图转移到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)?

1 个答案:

答案 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直接选择具有您正在搜索的属性值的节点。