我有一个简单的XML文档 no Namespace
以下是我在C#中编写的代码,用于搜索基于 Name 的特定元素。
public XmlElement SearchXML(string name)
{
XmlDocument xDoc = new XmlDocument();
string filePath = ConfigurationManager.AppSettings["path"];
xDoc.Load(filePath);
string xQryStr = "//NewPatient[Name='" + name + "']";
xDoc.SelectNodes(xQryStr);
XmlElement xmlEle = xDoc.DocumentElement;
return xmlEle;
}
XML文档如下
当我尝试调用方法 SearchXML 并传递 Dennis 作为争论时,它不返回仅包含特定元素的xml元素,而是返回整个文档。
我可能在哪里犯错?
任何帮助表示感谢。
答案 0 :(得分:2)
xDoc.SelectNodes(xQryStr)
不会改变原始文档。您需要存储此方法调用的返回值并返回该值。
ATM你只是返回原始文档的根元素(即整个树)
修改
在回答您的评论时,您可以按如下方式捕获第一个匹配的XmlElement:
xDoc.SelectNodes(xQryStr).OfType<XmlElement>().FirstOrDefault()
这将返回null
或XmlElement
答案 1 :(得分:2)
如果要根据XPath表达式选择节点列表,则需要以这种方式使用.SelectNodes
:
public XmlElement SearchXML(string name)
{
XmlDocument xDoc = new XmlDocument();
string filePath = ConfigurationManager.AppSettings["path"];
xDoc.Load(filePath);
string xQryStr = "//NewPatient[Name='" + name + "']";
XmlNodeList listOfNodes = xDoc.SelectNodes(xQryStr);
foreach(XmlNode node in listOfNodes
{
// do something with that list of XML nodes you've selected....
// XmlElement xmlEle = node;
// return xmlEle;
}
}
对.SelectNodes(xpath)
的调用返回匹配的XML节点列表(请参阅MSDN documentation on XmlDocument.SelectNodes
) - 一旦有了该列表,就可以迭代匹配的节点并执行和他们在一起......
或者,如果您只希望单个XML节点与XPath表达式匹配,那么您也可以使用.SelectSingleNode
:
string xQryStr = "//NewPatient[Name='" + name + "']";
XmlNode matchedNode = xDoc.SelectSingleNode(xQryStr);
if(matchedNode != null)
{
// do something with that list of XML nodes you've selected....
return matchedNode;
}
答案 2 :(得分:-1)
string xQryStr = "//NewPatient[Name='" + name + "']";
到
xQryStr = "/NewPatient[Name='" + name + "']";