鉴于此XML,我想从XmlNodeList
匹配'Tech'的<member>
个节点中检索<group>
个<id>
个节点。匹配应该不区分大小写。
<groups>
<group>
<id>Tech</id>
<members>
<member>johndoe</member>
<member>janedoe</member>
<member>robdoe</member>
</members>
</group>
<group>
<id>Support</id>
<members>
<member>johnfoe</member>
<member>janefoe</member>
<member>robfoe</member>
</members>
</group>
</groups>
我试过这个,期待得到“doe成员”,但它似乎没有返回任何结果。
// assume groupName='tech'
_document.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + groupName.ToUpper() + "']/members/member");
答案 0 :(得分:0)
我怀疑groupName
的价值不是你想象的那样。
我根据你的代码编译了这个例子,我得到了你似乎期待的结果:
var doc = new XmlDocument();
doc.LoadXml(
@"<groups>
<group>
<id>Tech</id>
<members>
<member>johndoe</member>
<member>janedoe</member>
<member>robdoe</member>
</members>
</group>
<group>
<id>Support</id>
<members>
<member>johnfoe</member>
<member>janefoe</member>
<member>robfoe</member>
</members>
</group>
</groups>");
foreach (XmlElement node in doc.SelectNodes("//groups/group[translate(id,'abcdefghijklmnopqrstuvxyz','ABCDEFGHIJKLMNOPQRSTUVXYZ')='" + "tech".ToUpper() + "']/members/member"))
Console.WriteLine(node.InnerText);
johndoe
janedoe
robdoe
按任意键继续。 。
我的另一个猜测(在黑暗中刺伤,因为它似乎对我有用!),是你遇到了当前语言(使用translate?)或XML的问题你加载的文件是否以某种方式被破坏(字节顺序标记?)。基本上,你的角色流问题。
答案 1 :(得分:0)
再次,很可能您的XML文档不是您向我们展示的内容。通常,似乎正确的XPath表达式不起作用的原因是文档具有定义的默认命名空间,并且表达式中使用的名称是非前缀的。
此C#控制台应用程序:
using System;
using System.Xml;
class TestXPath
{
static void Main(string[] args)
{
string xmlText =
@"<groups>
<group>
<id>Tech</id>
<members>
<member>johndoe</member>
<member>janedoe</member>
<member>robdoe</member>
</members>
</group>
<group>
<id>Support</id>
<members>
<member>johnfoe</member>
<member>janefoe</member>
<member>robfoe</member>
</members>
</group>
</groups>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlText);
string groupName = "tech";
string xpathExpr =
@"//groups/group
[translate(id,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')
='"
+ groupName.ToUpper() +@"'
]
/members/member";
XmlNodeList selection = doc.SelectNodes(xpathExpr);
foreach (XmlNode node in selection)
{
Console.WriteLine(node.OuterXml);
}
}
}
运行时,会产生预期的正确结果:
<member>johndoe</member>
<member>janedoe</member>
<member>robdoe</member>