Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 LINQXML和复杂查询_C# 4.0_Linq To Xml - Fatal编程技术网

C# 4.0 LINQXML和复杂查询

C# 4.0 LINQXML和复杂查询,c#-4.0,linq-to-xml,C# 4.0,Linq To Xml,我试图将两个元素的内部文本配对,最终得到了正确的输出,但我不确定它是否有效。我在想“从j…”和“从k…”必须在元素中迭代两次吗? 是否有一个组与我的解决方案相当 var query = from i in xdoc.Element("datasource") .Elements("dataobject") where (string)i.Attribute("type") == "HMIPage.Generic"

我试图将两个元素的内部文本配对,最终得到了正确的输出,但我不确定它是否有效。我在想“从j…”和“从k…”必须在元素中迭代两次吗?
是否有一个组与我的解决方案相当

var query = from i in xdoc.Element("datasource")
                          .Elements("dataobject")
            where (string)i.Attribute("type") == "HMIPage.Generic"

            from j in i.Elements("property")
            where (string)j.Attribute("name") == "PointRefParamName"
            let param = j.Value

            from k in i.Elements("property")
            where (string)k.Attribute("name") == "PointRefPointName"
            let point = k.Value

            select new
            {
                PointName = point,
                ParamName = param                                    
            };

foreach (var tag in query)
{
    Console.WriteLine("{0}.{1}", tag.PointName, tag.ParamName);
}
这是源文件:

<datasource version="2">
...
<dataobject id="1" type="HMIPage.Generic" format="propertybag">
    <property name="AddressFlags">0</property>
    <property name="AddressType">0</property>
    <property name="ObjectType">0</property>
    <property name="PointRefFlags">0</property>
    <property name="PointRefParamName">ModeState</property>
    <property name="PointRefParamOffset">0</property>
    <property name="PointRefPointName">01VE05_KMD</property>
    <property name="PresentationType">0</property>
    <property name="SecurityLevel">2</property>
    <property name="UpdatePeriod">0</property>
    <property name="version">1.2</property>
</dataobject>
<dataobject id="2" type="HMIPage.Generic" format="propertybag">
    <property name="AddressFlags">1</property>
    <property name="AddressType">0</property>
    <property name="ObjectType">0</property>
    <property name="PointRefFlags">0</property>
    <property name="PointRefParamName">PointState</property>
    <property name="PointRefParamOffset">0</property>
    <property name="PointRefPointName">01VE05_P1</property>
    <property name="PresentationType">0</property>
    <property name="SecurityLevel">2</property>
    <property name="UpdatePeriod">0</property>
    <property name="version">1.2</property>
</dataobject>
<dataobject id="3" type="HMIPage.PushButton" format="propertybag">
    <property name="Flags">0</property>
    <property name="PBActionType">1</property>
    <property name="RepeatFlag">0</property>
    <property name="SecurityLevel">2</property>
    <property name="StationIndex">0</property>
    <property name="TaskLrn">21</property>
    <property name="TaskParam1">1</property>
    <property name="TaskParam2">223</property>
    <property name="TaskParam3">0</property>
    <property name="TaskParam4">0</property>
    <property name="version">1.2</property>
</dataobject>
...
</datasource>

...
0
0
0
0
谦逊
0
01VE05_KMD
0
2.
0
1.2
1.
0
0
0
点状态
0
01VE05_P1
0
2.
0
1.2
0
1.
0
2.
0
21
1.
223
0
0
1.2
...
以及输出:

01VE05_KMD.Moderate

01VE05_P1.PointState

谢谢@jyparask。我在后来的某个地方提出了相同的解决方案,但它没有正确的输出。处理查询中的当前项和下一项的foreach循环将它们配对在一起,因为每个其他项都是“PointRefParamName”,每个其他项都是“PointRefPointName”。我会投赞成票,因为我感谢你在这方面所做的努力,但我不会认为这是正确的解决方案。
var query = xdoc.Root.Elements("dataobject")
        .Where(x=>x.Attribute("type").Value=="HMIPage.Generic")
        .Elements("property")
        .Where(x=>x.Attribute("name").Value== "PointRefParamName"||x.Attribute("name").Value== "PointRefPointName")
        .Select(x=>x.Value);