C# LINQ到XML-如何有效地访问XML中的内部标记?

C# LINQ到XML-如何有效地访问XML中的内部标记?,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我有一个如下所示的XML: <?xml version="1.0" encoding="utf-8" ?> <root> <data> <dataname>A</dataname> <property> <name>One</name> <value>1</value> </property> <pr

我有一个如下所示的XML:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <data>
    <dataname>A</dataname>
    <property>
      <name>One</name>
      <value>1</value>
    </property>
    <property>
      <name>Two</name>
      <value>2</value>
    </property>
  </data>
  <data>
    <dataname>B</dataname>
    <property>
      <name>One</name>
      <value>11</value>
    </property>
    <property>
      <name>Two</name>
      <value>22</value>
    </property>
  </data>
</root>
我认为这看起来很糟糕,在阅读了大量关于LINQtoXML的MSDN之后,我认为我还没有把它变成更好的代码。每当我试着用一个变量来做这件事时,我从来没有得到我想要的


有人能帮我简化一下吗?(这样我就可以知道我做错了什么)

您可以在一个查询中完成此操作:

public int GetDefaultValue(string dataBlock, string propName)
{
    var val =
            from data in xml.Elements("data")
            where (string)data.Element("dataname") == dataBlock
            from property in data.Elements("property")
            where (string)property.Element("name") == propName
            select property.Element("value");

    return (int)val.First();
}

您可以在一个查询中执行此操作:

public int GetDefaultValue(string dataBlock, string propName)
{
    var val =
            from data in xml.Elements("data")
            where (string)data.Element("dataname") == dataBlock
            from property in data.Elements("property")
            where (string)property.Element("name") == propName
            select property.Element("value");

    return (int)val.First();
}
试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            int results = test.GetDefaultValue("A", "One");
        }
    }
    public class Test
    {
        const string FILENAME = @"c:\temp\test.xml";
        XDocument xml = null;
        public Test()
        {
            xml = XDocument.Load(FILENAME);
        }


        public int GetDefaultValue(string dataBlock, string propName)
        {

            return xml.Descendants("data")
                .Where(x => (string)x.Element("dataname") == dataBlock)
                .Descendants("property")
                .Where(y => (string)y.Element("name") == propName)
                .Select(z => (int)z.Element("value")).FirstOrDefault();

        }
    }
}
试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            int results = test.GetDefaultValue("A", "One");
        }
    }
    public class Test
    {
        const string FILENAME = @"c:\temp\test.xml";
        XDocument xml = null;
        public Test()
        {
            xml = XDocument.Load(FILENAME);
        }


        public int GetDefaultValue(string dataBlock, string propName)
        {

            return xml.Descendants("data")
                .Where(x => (string)x.Element("dataname") == dataBlock)
                .Descendants("property")
                .Where(y => (string)y.Element("name") == propName)
                .Select(z => (int)z.Element("value")).FirstOrDefault();

        }
    }
}

对于可能有同样问题的VB用户

Public Function GetDefaultValue(dataBlock As String, propName As String) As Integer
    'note - returns zero if not found
    Return (From d In xe.Elements
            Where d.<dataname>.Value = dataBlock
            From p In d.<property>
            Where p.<name>.Value = propName
            Select CInt(p.<value>.Value) Take 1).FirstOrDefault
End Function
公共函数GetDefaultValue(数据块为字符串,propName为字符串)为整数
'注意-如果未找到,则返回零
返回(来自xe.Elements中的d
其中d..Value=数据块
从p到d。
其中p..Value=propName
选择CInt(p..Value)取1.FirstOrDefault
端函数
使用这些数据

Dim xe As XElement = <root>
                         <data>
                             <dataname>A</dataname>
                             <property>
                                 <name>One</name>
                                 <value>1</value>
                             </property>
                             <property>
                                 <name>Two</name>
                                 <value>2</value>
                             </property>
                         </data>
                         <data>
                             <dataname>B</dataname>
                             <property>
                                 <name>One</name>
                                 <value>11</value>
                             </property>
                             <property>
                                 <name>Two</name>
                                 <value>22</value>
                             </property>
                         </data>
                     </root>
Dim xe As XElement=
A.
一个
1.
两个
2.
B
一个
11
两个
22

适用于可能有相同问题的VB用户

Public Function GetDefaultValue(dataBlock As String, propName As String) As Integer
    'note - returns zero if not found
    Return (From d In xe.Elements
            Where d.<dataname>.Value = dataBlock
            From p In d.<property>
            Where p.<name>.Value = propName
            Select CInt(p.<value>.Value) Take 1).FirstOrDefault
End Function
公共函数GetDefaultValue(数据块为字符串,propName为字符串)为整数
'注意-如果未找到,则返回零
返回(来自xe.Elements中的d
其中d..Value=数据块
从p到d。
其中p..Value=propName
选择CInt(p..Value)取1.FirstOrDefault
端函数
使用这些数据

Dim xe As XElement = <root>
                         <data>
                             <dataname>A</dataname>
                             <property>
                                 <name>One</name>
                                 <value>1</value>
                             </property>
                             <property>
                                 <name>Two</name>
                                 <value>2</value>
                             </property>
                         </data>
                         <data>
                             <dataname>B</dataname>
                             <property>
                                 <name>One</name>
                                 <value>11</value>
                             </property>
                             <property>
                                 <name>Two</name>
                                 <value>22</value>
                             </property>
                         </data>
                     </root>
Dim xe As XElement=
A.
一个
1.
两个
2.
B
一个
11
两个
22

谢谢!奇怪的是,当我尝试类似的东西时,它对我不起作用。谢谢!奇怪的是,当我尝试类似的东西时,它对我不起作用。谢谢!这非常有效,但我还不太熟悉lambda表达式的使用。不过,非常感谢!谢谢这非常有效,但我还不太熟悉lambda表达式的使用。不过,非常感谢!