Как перебирать узлы XDocument - PullRequest
       0

Как перебирать узлы XDocument

25 голосов
/ 14 февраля 2011

Я пытаюсь перебрать узлы моего XML-документа, чтобы получить значение <username>Ed</username> в каждом узле. Я использую Linq для сортировки XDocument, а затем пытаюсь перебрать узлы. Я не могу найти правильный цикл foreach для достижения этой цели. Любая помощь приветствуется.

var doc = XDocument.Load("files\\config.xml");
var newDoc = new XDocument(new XElement("Config",
            from p in doc.Element("Config").Elements("Profile")
            orderby int.Parse(p.Element("order").Value)
            select p));


foreach (XElement xe in newDoc.Nodes())
{
    MessageBox.Show(xe.Element("username").Value);
}

// XML document
<Config>
<Profile>
    <id>Scope</id>
    <username>Scope 1</username>
    <password>...</password>
    <cdkey>0000</cdkey>
    <expkey></expkey>
    <cdkeyowner>Scope</cdkeyowner>
    <client>W2BN</client>
    <server>[IP]</server>
    <homechannel>Lobby</homechannel>
    <load>1</load>
    <order>2</order>
</Profile>
<Profile>
    <id>Scope 2</id>
    <username>Scope 2</username>
    <password>...</password>
    <cdkey>0000</cdkey>
    <expkey></expkey>
    <cdkeyowner>Scope</cdkeyowner>
    <client>W2BN</client>
    <server>[IP]</server>
    <homechannel>Lobby</homechannel>
    <load>1</load>
    <order>1</order>
</Profile>
</Config>

Ответы [ 3 ]

46 голосов
/ 14 февраля 2011

Попробуй это.Не уверен, зачем вам второй документ.

foreach (XElement xe in doc.Descendants("Profile"))
{
    MessageBox.Show(xe.Element("username").Value);
}
4 голосов
/ 14 февраля 2011

Проще использовать XPathDocument и выражение XPath.

var doc = new XPathDocument("files\\config.xml")
foreach (var username in doc.CreateNavigator().Select("//username")
{
    ...
}
1 голос
/ 13 января 2017

Если вы ищете внутренний узел, например рекурсивный, вы можете проверить, есть ли у элемента элемент.Например, предположим, что вы читаете свой XML из базы данных

string xmlRoot = "select XmlItem from db";
XDocument doc = XDocument.Parse(xmlRoot);
List<XElement> xElementList = doc.Descendants().Tolist();
foreach(XElement element in xElementList )
{
  // read the element and do with your node
  if(element.HasElements)
    {
      // here you can reach nested node
    }

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...