Nischal Bhatt Ответов: 1

Как получить / получить дочерние узлы в XML? C# linq to XML


Всем Привет,

У меня есть постановка задачи, в которой я хочу получить дочерние узлы конкретного идентификатора
используя Linq to XML, я могу получить все данные узла вместе с другими данными, как я могу извлечь дочерний узел из среды.

Вот моя XML файловая структура :
<ProjectEnvironments>
<ProjectEnvironment>
    <ProjectId>22</ProjectId>
    <ProjectName>Proj22</ProjectName>
    <GroupName>Group</GroupName>
    <ProjectApIUrl>http://localhost.dell.com/PremierToolsUX#/Gvt/API</ProjectApIUrl>
    <ProjectUrl>http://localhost.dell.com/PremierToolsUX#/Gvt</ProjectUrl>
    <Environments>
      <Environment>
        <EnvId>22</EnvId>
        <EnvName>Proj22</EnvName>
      </Environment>
      <Environment>
        <EnvId>33</EnvId>
        <EnvName>Proj33</EnvName>
      </Environment>
    </Environments>
  </ProjectEnvironment>
</ProjectEnvironments>


используя приведенный ниже код, я могу получить все XML-данные на основе ProjectId, как я могу получить данные сред, т. е. все EnvId и EnvName для одного и того же узла ProjectId ?

XDocument _XDocument = XDocument.Load(@"C:\test.xml");
var items = from item in _XDocument.Elements("ProjectEnvironments").Elements("ProjectEnvironment")
                                where item != null && (item.Element("ProjectId").Value == projectId)
                                select item;


чтобы получить среды я попробовал следующий код который дает ошибку ссылки на объект

var Envs = from itemz in _XDocument.Descendants("ProjectEnvironments").Descendants("ProjectEnvironment").Descendants("Environments").Descendants("Environment")
           where item != null && (item.Element("EnvId").Value == _environments[0].EnvId)
           select item;


Может ли кто-нибудь помочь мне решить эту проблему?
заранее спасибо

Что я уже пробовал:

Here's my XML file structure : 
<pre>
<ProjectEnvironments>
<ProjectEnvironment>
    <ProjectId>22</ProjectId>
    <ProjectName>Proj22</ProjectName>
    <GroupName>Group</GroupName>
    <ProjectApIUrl>http://localhost.dell.com/PremierToolsUX#/Gvt/API</ProjectApIUrl>
    <ProjectUrl>http://localhost.dell.com/PremierToolsUX#/Gvt</ProjectUrl>
    <Environments>
      <Environment>
        <EnvId>22</EnvId>
        <EnvName>Proj22</EnvName>
      </Environment>
      <Environment>
        <EnvId>33</EnvId>
        <EnvName>Proj33</EnvName>
      </Environment>
    </Environments>
  </ProjectEnvironment>
</ProjectEnvironments>


используя приведенный ниже код, я могу получить все XML-данные на основе ProjectId, как я могу получить данные сред, т. е. все EnvId и EnvName для одного и того же узла ProjectId ?

XDocument _XDocument = XDocument.Load(@"C:\test.xml");
var items = from item in _XDocument.Elements("ProjectEnvironments").Elements("ProjectEnvironment")
                                where item != null && (item.Element("ProjectId").Value == projectId)
                                select item;


чтобы получить среды я попробовал следующий код который дает ошибку ссылки на объект

var Envs = from itemz in _XDocument.Descendants("ProjectEnvironments").Descendants("ProjectEnvironment").Descendants("Environments").Descendants("Environment")
           where item != null && (item.Element("EnvId").Value == _environments[0].EnvId)
           select item;


Может ли кто-нибудь помочь мне решить эту проблему?

1 Ответов

Рейтинг:
1

RickZeeland

Попробовать это:

XDocument xdoc = XDocument.Load(@"C:\test.xml");
var envs = from lv1 in xdoc.Descendants("Environment") where lv1.Element("EnvId").Value == "22" select new { lv1 };

foreach (var env in envs)
{
    Debug.Print("val = " + env.lv1.Element("EnvName").Value + Environment.NewLine);
}


Nischal Bhatt

Спасибо Рикзиленд,

Это даст мне данные для одного EnvId, как я могу изменить этот запрос так, чтобы он возвращал список EnvId и EnvName? Я застрял на этом сценарии

RickZeeland

Тогда вы можете использовать:
ВАР envs = от Л. В. 1 в xdoc по.Потомки("окружение") выбирают новый { lv1 };