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

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

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

上一个按钮也是如此,它将减少 pid 的 1 值(pid = 1)。

有人知道该怎么做吗?

// - - - - - - -编辑 - - - - - - - - -

感谢LB,我正在尝试使用他的代码。但是我有一个错误。

在此处输入图像描述

我的代码实现是否正确?

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;
        ////////////////////


    }
4

6 回答 6

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;
于 2012-09-30T12:28:37.317 回答
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
            ;
于 2012-09-30T12:43:03.910 回答
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
}

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

于 2012-09-30T12:44:13.927 回答
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";
    }
}

将 static 初始化itemIndex为 1 并进一步使用它,例如itemIndex++(for Next)和itemIndex--(for Prev)。

于 2012-09-30T14:17:52.433 回答
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;
}
于 2012-09-30T12:53:19.427 回答
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;

于 2016-10-03T06:20:10.127 回答