Чтение данных из XML с атрибутами

1

У меня есть XML файл, который выглядит следующим образом:

<CPageDataXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<control id="busRowOAppr2EIDLookUpUserControl" controltype="business">
    <field controlvaluetype="single" key="busRowOAppr2EIDLookUpUserControl_txtEID">
      <valuefield value="709227">E8 - John Doe</valuefield>
    </field>
    <field controlvaluetype="hidden_single" key="busRowOAppr2EIDLookUpUserControl_txtEID_Email">
      <valuefield value="[email protected]">emailid</valuefield>
    </field>
</control>
<control id="busDelegationFromDate123" controltype="business">
    <field controlvaluetype="single" key="txtCalanderDateWithImage_UserControl">
      <valuefield value="" />
    </field>
</control>
</CPageDataXML>

Я хочу прочитать значение поля значения, где id = "busRowOAppr2EIDLookUpUserControl"

Код С#: Это код для загрузки XML:

XmlDocument xPagedata=new XmlDocument();
XmlNode xnodePagedata = null;
xPagedata.LoadXml(strPageData);

Это код для SelectSingleNode:

string a = xnodePagedata.SelectSingleNode(//Control[@id='busRowOAppr2EIDLookUpUserControl']).Attributes["Value"].Value;

Я попытался использовать SelectSingleNode (string), но это дает мне исключение для ссылки на null. Просьба предложить, как мне это сделать. Я абсолютно новичок в XML.

  • 0
    Что вы используете для чтения / анализа XML? Вы используете Linq-to-XML? Вы обращаете внимание на ваши xmlns ? Пожалуйста, опубликуйте код, который у вас есть.
  • 0
    Пожалуйста, покажите, что вы пробовали - и я бы порекомендовал использовать LINQ to XML лично ... вам вообще не нужен XPath для этого.
Показать ещё 2 комментария
Теги:
xml-parsing
c#-4.0

2 ответа

1
Лучший ответ

Один из возможных способов использования одного и того же подхода:

string a = 
    xnodePagedata.SelectSingleNode("//control[@id='busRowOAppr2EIDLookUpUserControl']/field/valuefield/@value")
                 .Value;

ОБНОВИТЬ :

Если в одном <control> есть несколько <valuefield> и вы хотите все value s, используйте SelectNodes() например:

var values =
    xPagedata.SelectNodes("//control[@id='busRowOAppr2EIDLookUpUserControl']/field/valuefield/@value");
foreach (XmlNode value in values)
{
    Console.WriteLine(value.Value);
}
  • 0
    Первое утверждение действительно сработало для меня. Большое спасибо.
1

Вы можете использовать XDocument: использовать Descendants("control") чтобы получить все элементы управления, а затем отфильтровать их, используя предложение Where, затем используйте SelectMany чтобы получить сглаженный набор значений поля значения.

XDocument doc = XDocument.Load(filepath);

var result = doc.Descendants("control")
                .Where(i => (string)i.Attribute("id") == "busRowOAppr2EIDLookUpUserControl")
                .SelectMany(i => i.Descendants("valuefield")
                                  .Select(j => j.Attribute("value")))
                .ToList();

И это результат:

result  Count = 2    
[0] {value="709227"}    
[1] {value="[email protected]"}
  • 0
    Здравствуй. XMLDocument и XDocument - это одно и то же? Я использовал XMLDocument для загрузки XML.
  • 0
    Нет, это не так. Рекомендуется использовать System.Xml.Linq.XDocument
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню