我的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;
现在对于父节点(例如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();
}
我假设您已经将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
。