1

我的 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在 var say 中有元素值sourceX。前任

SourceX = "settings/subscriptions" 

或者

SourceX = "activity/editactivity"

我正在尝试使用以下代码获取父节点,如果有问题请告诉我

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

现在对于父节点(比如ActivityPRor Usersettings) and的组合Source,我必须找到对应的DestinationControllerand DestinationAction

我怎么做?与 LINQ 相比,更喜欢传统的 XML,因为其余代码都是这种形式。

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


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


        }
4

1 回答 1

2

我假设您已经将 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第一个。

于 2011-12-10T11:35:59.600 回答