根据根节点和其中一个元素读取其他xml元素



我的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>

我将在变量sourceX中拥有Source元素值。

交货
SourceX = "settings/subscriptions" 

SourceX = "activity/editactivity"

我正在尝试使用下面的代码获得父节点,让我知道是否有什么问题

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

现在对于父节点(例如ActivityPRUsersettings)和Source的组合,我必须找到相应的DestinationControllerDestinationAction

我该怎么做?选择传统的XML而不是LINQ,因为其余的代码都是这种形式。

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

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

        }

我假设您已经将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

最新更新