2

我有一个没有命名空间的简单 XML 文档

这是我用 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文档如下

XML 文件的屏幕截图

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

我可能在哪里犯错?

任何帮助表示赞赏。

4

3 回答 3

3

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

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

编辑

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

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

这将返回一个null或一个XmlElement

于 2012-10-16T08:42:13.730 回答
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 文档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;
    }
于 2012-10-16T09:01:36.377 回答
-1

你能改变吗

string xQryStr = "//NewPatient[Name='" + name + "']";

 xQryStr = "/NewPatient[Name='" + name + "']";

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

于 2012-10-16T08:47:05.907 回答