在C#中查找特定值的所有子节点

时间:2012-09-30 12:17:28

标签: c# xml search xmlnode

<main>
  <myself>
    <pid>1</pid>
    <name>abc</name>
  </myself>
  <myself>
    <pid>2</pid>
    <name>efg</name>
  </myself>
</main>

这是我的名为simpan的XML文件。我有两个按钮。下一个和上一个。我想要做的是,当用户单击按钮时,所有信息将显示在TextBox上。搜索节点将基于pid。

下一步按钮将添加1个pid值(假设pid = 2),它将搜索具有相同pid = 2值的节点。它还会显示pid = 2的名称。 (显示名称= abc)

同样适用于上一个按钮,它会减少pid的1值(pid = 1)。

有人知道怎么做吗?

// ------------- EDIT ------------------

感谢L.B,我试图使用他的代码。但是我收到了一个错误。

enter image description here

我的代码实现是否正确?

private void previousList_Click(object sender, EventArgs e)
    {
        pid = 14;

        XDocument xDoc = XDocument.Parse("C:\\Users\\HDAdmin\\Documents\\Fatty\\SliceEngine\\SliceEngine\\bin\\Debug\\simpan.xml");

        var name = xDoc.Descendants("myself")
                    .First(m => (int)m.Element("PatientID") == pid)
                    .Value;

        textETA.Text = name;
        ////////////////////


    }

6 个答案:

答案 0 :(得分:2)

int pid = 2;
XDocument xDoc = XDocument.Parse(xml); //Load

var name = xDoc.Descendants("myself")
            .First(m => (int)m.Element("pid") == pid)
            .Element("name")
            .Value;

答案 1 :(得分:0)

您可以使用以下XPath列出所有Myself代码,然后使用简单的Linq命令查找您想要的内容:

XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "file1.xml");
        var resNodes = xmlDoc.SelectNodes("//myself");
        XmlNode res = null;
        var val = textBox1.Text;

        var item = from XmlNode x in resNodes
                   select x;

        foreach (var nodP in item) {
            foreach (XmlNode nod in nodP.ChildNodes) {
                if (nod.InnerText == val) {
                    res = nodP;
                }
            }
        }

        if (res == null)
            // not found!
            ;
        else
            // show the result
            ;

答案 2 :(得分:0)

叫我老式,但你可以使用XPath,例如:

string xml =
    @"<main>
        <myself>
            <pid>1</pid>
            <name>abc</name>
        </myself>
        <myself>
            <pid>2</pid>
            <name>efg</name>
        </myself>
      </main>";

using System.Xml;

....

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
// Replace "2" in the string below with the desired pid
XmlNode xmlNode = 
    xmlDocument.DocumentElement.SelectSingleNode("myself/name[../pid=2]");
// xmlNode contains the <name>efg</name> XmlElement. For example:
string name = xmlNode.Value;

如果它可以匹配多个节点,例如可能有多个<myself>元素,子元素<pid>设置为2,请改用以下代码:

foreach(XmlNode xmlNode in 
    xmlDocument.DocumentElement.SelectNodes("myself/name[../pid=2]"))
{
    // xmlNode contains the matching <name> element
}

在这两种情况下,都可以使用XmlNode属性从Value中提取值。

答案 3 :(得分:0)

private void previousList_Click(object sender, EventArgs e)
{
    pid = 14;

    XDocument xDoc = XDocument.Load(@"C:\Users\HDAdmin\Documents\Fatty\SliceEngine\SliceEngine\bin\Debug\simpan.xml");

    var name = xDoc.Root
                   .Descendants("myself")
                   .FirstOrDefault(e => e.Element("pid")
                   .Value
                   .Equals(pid.ToString(CultureInfo.InvariantCulture)))
                   .Element("name")
                   .Value;

    textETA.Text = name;
}

答案 4 :(得分:0)

public class simpman
{

    private static XElement root = XElement.Load("Simpman.xml");

    public static string GetItem(int index)
    {
        XElement item =
        (from element in root.Elements("myself")
        where (int)element.Element("pid") == index
        select element.Element("name")).SingleOrDefault();

        return item != null ? item.Value : "Please check the Index";
    }
}

将静态itemIndex初始化为1并进一步使用itemIndex++(适用于下一个)和itemIndex--(适用于上一个)。

答案 5 :(得分:0)

XmlDocument doc = new XmlDocument(); FileStream fs = new FileStream(rootXMLPath, FileMode.Open, FileAccess.Read); doc.Load(fs); XmlNode node = doc.DocumentElement;

nodeName = "/main/myself";

var child1 = node.SelectSingleNode(nodeName).ChildNodes[0].FirstChild.InnerXml; var child2 = node.SelectSingleNode(nodeName).ChildNodes[0].LastChild.InnerXml; var child3 = node.SelectSingleNode(nodeName).ChildNodes[1].FirstChild.InnerXml; var child4 = node.SelectSingleNode(nodeName).ChildNodes[1].LastChild.InnerXml;