Читать другие элементы XML на основе корневого узла и одного элемента? - PullRequest
1 голос
/ 10 декабря 2011

Мой XML приведен ниже.

<UrlRoutes>
  <ActivityPR>
     <Source>activity/editactivity</Source>
     <DestinationController>Activity</DestinationController>
     <DestinationAction>Editactivity</DestinationAction>  
  </ActivityPR>
  <UserSettings>
     <Source>settings/subscriptions</Source>
     <DestinationController>UserSettings</DestinationController>
     <DestinationAction>GetUserPreferenceSettings</DestinationAction>
  </UserSettings>
</UrlRoutes>

У меня будет Source значение элемента в переменной скажем sourceX.Пример

SourceX = "settings/subscriptions" 

или

SourceX = "activity/editactivity"

Я пытаюсь получить родительский узел, используя приведенный ниже код, дайте мне знать, если что-то не так

XmlElement xmlNode = xmlDoc.GetElementById(SourceX);
XmlNode parent = xmlNode.ParentNode;

Теперь для комбинации для родительского узла (скажем, ActivityPR или Usersettings) и Source, я должен найти соответствующие DestinationController и DestinationAction.

Как мне это сделать?Предпочитаю традиционный XML, а не LINQ, поскольку остальная часть кода находится в этой форме.

if(node!=null)
        {
            XmlElement routeElement = (XmlElement)node;


            strController = routeElement.GetElementsByTagName("DestinationController")[0].InnerText.ToString();
            strAction = routeElement.GetElementsByTagName("DestinationAction")[0].InnerText.ToString();


        }

1 Ответ

2 голосов
/ 10 декабря 2011

Я предполагаю, что вы уже загрузили XML в ваш XmlDocument - правильно?

В этом случае вы сможете использовать что-то вроде этого:

string xpath = string.Format("/UrlRoutes/*[Source='{0}']", sourceX);
XmlNode node = xmlDoc.SelectSingleNode(xpath);

if(node != null)
{
    // use the node to do whatever you need to do
}

Выражение xpath в основном выбирает любой узел в /UrlRoutes, который содержит элемент <Source> с данной строкой в ​​качестве значения.Это означает: значения <Source> должны быть уникальными.

Обновление: если вы знаете , вы хотите искать только внутри узлов <UserSettings>, вы можетесделайте ваше выражение XPath более избирательным:

string parentNode = "UserSettings";
string sourceX = "settings/subscriptions";

string xpath = string.Format("/UrlRoutes/{0}[Source='{1}']", parentNode, sourceX);

Но с этим более избирательным XPath вы бы не смогли бы найти узел, когда в вашем примере sourceX = "activity/editactivity" (так как не внутри <UserSettings> узла)

Обновление № 2: Я бы, вероятно, использовал этот код для захвата элементов внутри вашего узла:

if(node != null)
{
   string dc = node.SelectSingleNode("DestinationController").InnerXml;
   string da = node.SelectSingleNode("DestinationAction").InnerXml;
}

Таким образом, вам не нужно сначала конвертировать в XmlElement.

...