C# 在Linq到XML中查找元素

C# 在Linq到XML中查找元素,c#,linq-to-xml,C#,Linq To Xml,我生成了一个XML文件,它看起来像这样: <?xml version="1.0" encoding="utf-8"?> <Members xmlns="urn:lst-emp:emp"> <Member xmlns=""> <!--Info for Member TESTER--> <AccountName>Test Name</AccountName> <AccountNumber>

我生成了一个XML文件,它看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Members xmlns="urn:lst-emp:emp">
  <Member xmlns="">
    <!--Info for Member TESTER-->
    <AccountName>Test Name</AccountName>
    <AccountNumber>Test Number</AccountNumber>
    <AccountBalance>Test Balance</AccountBalance>
  </Member>
  <Member xmlns="">
    <!--Info for Member Jeff Reed-->
    <AccountName>Jeff Reed</AccountName>
    <AccountNumber>5929</AccountNumber>
    <AccountBalance>9223.01</AccountBalance>
  </Member>
</Members>
    internal static XElement FindMember(String validationName)
    {
        XDocument doc = XDocument.Load(Application.LocalUserAppDataPath + "\\members.xml");

        XElement accountNameElement = doc.Root
                                         .Elements("Member")
                                         .Elements("AccountName")
                                         .FirstOrDefault(e => e.Value == validationName);

        if (accountNameElement != default(XElement))
            return accountNameElement.Parent;
        return default(XElement);
    }
        XElement memberElement= FindMember("Test Name");
        if (memberElement== default(XElement))
            Console.WriteLine("Not Found");
        else
        {
            Console.WriteLine("Found {0}, {1}, {2}"
                , memberElement.Element("AccountName").Value
                , memberElement.Element("AccountNumber").Value
                , memberElement.Element("AccountBalance").Value);
        }

以下代码为您提供匹配元素的帐号

members.Where(x=> x.Element("AccountName").Value==validationName).Select(x=> x.Element("AccountNumber").Value).FirstOrDefault();

父母是关键。大概是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Members xmlns="urn:lst-emp:emp">
  <Member xmlns="">
    <!--Info for Member TESTER-->
    <AccountName>Test Name</AccountName>
    <AccountNumber>Test Number</AccountNumber>
    <AccountBalance>Test Balance</AccountBalance>
  </Member>
  <Member xmlns="">
    <!--Info for Member Jeff Reed-->
    <AccountName>Jeff Reed</AccountName>
    <AccountNumber>5929</AccountNumber>
    <AccountBalance>9223.01</AccountBalance>
  </Member>
</Members>
    internal static XElement FindMember(String validationName)
    {
        XDocument doc = XDocument.Load(Application.LocalUserAppDataPath + "\\members.xml");

        XElement accountNameElement = doc.Root
                                         .Elements("Member")
                                         .Elements("AccountName")
                                         .FirstOrDefault(e => e.Value == validationName);

        if (accountNameElement != default(XElement))
            return accountNameElement.Parent;
        return default(XElement);
    }
        XElement memberElement= FindMember("Test Name");
        if (memberElement== default(XElement))
            Console.WriteLine("Not Found");
        else
        {
            Console.WriteLine("Found {0}, {1}, {2}"
                , memberElement.Element("AccountName").Value
                , memberElement.Element("AccountNumber").Value
                , memberElement.Element("AccountBalance").Value);
        }
这样调用:

<?xml version="1.0" encoding="utf-8"?>
<Members xmlns="urn:lst-emp:emp">
  <Member xmlns="">
    <!--Info for Member TESTER-->
    <AccountName>Test Name</AccountName>
    <AccountNumber>Test Number</AccountNumber>
    <AccountBalance>Test Balance</AccountBalance>
  </Member>
  <Member xmlns="">
    <!--Info for Member Jeff Reed-->
    <AccountName>Jeff Reed</AccountName>
    <AccountNumber>5929</AccountNumber>
    <AccountBalance>9223.01</AccountBalance>
  </Member>
</Members>
    internal static XElement FindMember(String validationName)
    {
        XDocument doc = XDocument.Load(Application.LocalUserAppDataPath + "\\members.xml");

        XElement accountNameElement = doc.Root
                                         .Elements("Member")
                                         .Elements("AccountName")
                                         .FirstOrDefault(e => e.Value == validationName);

        if (accountNameElement != default(XElement))
            return accountNameElement.Parent;
        return default(XElement);
    }
        XElement memberElement= FindMember("Test Name");
        if (memberElement== default(XElement))
            Console.WriteLine("Not Found");
        else
        {
            Console.WriteLine("Found {0}, {1}, {2}"
                , memberElement.Element("AccountName").Value
                , memberElement.Element("AccountNumber").Value
                , memberElement.Element("AccountBalance").Value);
        }

您已经知道如何获取
AccountName
,您可以以完全相同的方式获取
AccountNumber
member.Element(“AccountNumber”).Value
。此外,永远不要使用
float
double
来表示货币值。但是如何找到特定的元素AccountNumber?我在每个AccountName中搜索匹配项,但一旦找到它匹配的元素,我就需要找到它的AccountNumber。嗯,一旦找到它匹配的元素,你就有了它匹配的元素,这正是你要寻找的。我认为
Single()
比这里的
FirstOrDefault()
更有意义。@svick:是的。但是最好使用
SingleOrDefault()
如何覆盖找到的值?