2014-11-27 2 views
0

Я пытаюсь перейти к другому атрибуту в элементе xml, но мне не очень повезло.Перейти к новому атрибуту в XML String

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 

В основном, когда идентификатор равен, что на моей форме, я хочу, чтобы перейти к атрибуту ddlNote и вывести значение из него. Он запускает первый оператор if, когда он совпадает с идентификатором, который находится в форме, которую он перемещает во внутренний оператор if, но внутренний оператор if не запускается. Как я перейду к этому атрибуту (видя, что я начинаю с атрибута id, как бы перейти к ddlNote)?

ответ

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 получает полный текст узла и подузлов.

EDIT: Еще короче:

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 непосредственно выбрать узел, который имеет значение атрибута, которое вы ищете.

+0

Я думаю, что нашел решение, очень похожее на последнюю часть, которую вы разместили здесь, спасибо за вашу помощь! –