Nat*_*han 6 .net c# xml xslt xpath
我使用XPath来排除菜单中的某些节点.我想扩展它以排除在数组中标识的节点.
这可以排除菜单中所有节点,其id为2905,其类型不是内容:
XmlNodeList nextLevelNodeList = currentNode
.SelectNodes(string
.Format("
Menu[not(MenuId = 2905)]
/Item[
ItemLevel = {0}
and
ItemType != 'Javascript'
] |
Menu[MenuId = 2905]
/Item[
ItemLevel = {0}
and
ItemType = 'content'
]", iLevel));
Run Code Online (Sandbox Code Playgroud)
我想要的是将menuId和其他几个存储在一个数组中,然后在string.Format函数中引用该数组
就像是:
int[] excludeSubmenus = {2905, 323};
XmlNodeList nextLevelNodeList = currentNode
.SelectNodes(string
.Format("
Menu[not(MenuId in excludesubMenus)]
/Item[
ItemLevel={0}
and
ItemType != 'Javascript'
] |
Menu[MenuId in excludeSubMenus]
/Item[
ItemLevel={0}
and
ItemType='content'
]", iLevel));
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激!
塔内森
编辑 - 包括示例xml
<Item>
<ItemId>322</ItemId>
<ItemType>Submenu</ItemType>
<ItemLevel>2</ItemLevel>
<Menu>
<MenuId>322</MenuId>
<MenuLevel>2</MenuLevel>
<Item>
<ItemId>2905</ItemId>
<ItemType>Submenu</ItemType>
<ItemLevel>3</ItemLevel>
<Menu>
<MenuId>2905</MenuId>
<MenuLevel>3</MenuLevel>
<Item>
<ItemId>19196</ItemId>
<ItemType>content</ItemType>
<ItemLevel>4</ItemLevel>
</Item>
<Item>
<ItemId>19192</ItemId>
<ItemType>Submenu</ItemType>
<ItemLevel>4</ItemLevel>
</Item>
</Menu>
</Item>
<Item>
<ItemId>2906</ItemId>
<ItemType>Submenu</ItemType>
<ItemLevel>3</ItemLevel>
<Menu>
<MenuId>323</MenuId>
<MenuLevel>3</MenuLevel>
<Item>
<ItemId>2432</ItemId>
<ItemType>content</ItemType>
<ItemLevel>4</ItemLevel>
</Item>
<Item>
<ItemId>12353</ItemId>
<ItemType>Submenu</ItemType>
<ItemLevel>4</ItemLevel>
</Item>
</Menu>
</Item>
</Menu>
</Item>
Run Code Online (Sandbox Code Playgroud)
使用:
int[] excludeSubmenus = {2905, 323};
string notExpr = string.Empty;
for(int i=0; i < excludeSubmenus.Length; i++)
{
notExpr += string.Format("not(MenuId={0})", excludeSubmenus[i]);
if(i != excludeSubmenus.Count-1)
notExpr += " and ";
}
XmlNodeList nextLevelNodeList =
currentNode.SelectNodes(
string.Format("//Menu[MenuId in excludeSubMenus]/Item
[ItemLevel={1} and not(ItemType='Javascript')]",
notExpr, iLevel)
);
Run Code Online (Sandbox Code Playgroud)
请注意:在上面的代码中,字符串已被分成不同的行以增强可读性。在 ypur 代码中,您不得拆分任何字符串,或使用字符串+(连接)运算符来达到相同的效果。