XmlDoc SelectNodes选择整个文档

时间:2012-10-16 08:40:24

标签: c# xml

我有一个简单的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文档如下

Screenshot of XML file

当我尝试调用方法 SearchXML 并传递 Dennis 作为争论时,它不返回仅包含特定元素的xml元素,而是返回整个文档。

我可能在哪里犯错?

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

xDoc.SelectNodes(xQryStr)不会改变原始文档。您需要存储此方法调用的返回值并返回该值。

ATM你只是返回原始文档的根元素(即整个树)

修改

在回答您的评论时,您可以按如下方式捕获第一个匹配的XmlElement:

xDoc.SelectNodes(xQryStr).OfType<XmlElement>().FirstOrDefault()

这将返回nullXmlElement

答案 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 + "']";

请参阅以下链接 http://www.csharp-examples.net/xml-nodes-by-name/