簡體   English   中英

如何比較兩個 XElement 枚舉?

[英]How to compare two XElement enumerables?

我有兩個相同大小的 XElements 列表:

var documentDatabase = XDocument.Parse(xmlDatabase);
var rootElementDatabase = documentDatabase.Root;
var segmentsDatabase = rootElementDatabase.Descendants("Segment");

var documentSlave = XDocument.Parse(xmlSlave);
var rootElementSlave = documentSlave.Root;
var segmentsSlave = rootElementSlave.Descendants("Segment");

基本上是 Segment 元素列表,如下所示:

        <Segment>
            <IdRef>1</IdRef>
            <Start>
                <Master>0</Master>
                <Slave>0</Slave>
                <PntType>4</PntType>
            </Start>
            <End>
                <Master>10.059000</Master>
                <Slave>29.450302</Slave>
                <PntType>4</PntType>
            </End>
            <Symmetry>0.5</Symmetry>
            <FunctionType>1</FunctionType>
        </Segment>

我想要的是通過比較<Master><Slave>標簽中的值來比較它們是否相等,忽略其余部分。 我怎樣才能實現它?

如果您有多個細分,請創建一個方法來比較它們

Private Function ChkSeg(segment As XElement) As Boolean
    If segment.<Start>.<Master>.Value = segment.<End>.<Master>.Value AndAlso
         segment.<Start>.<Slave>.Value = segment.<End>.<Slave>.Value Then
        Return True
    Else
        Return False
    End If
End Function

然后像這樣迭代 XML

    For Each el As XElement In xe.Elements
        If ChkSeg(el) Then
            Stop
        Else
            Stop
        End If
    Next

使用此測試

    Dim xe As XElement

    xe = <segments>
             <Segment>
                 <IdRef>1</IdRef>
                 <Start>
                     <Master>0</Master>
                     <Slave>0</Slave>
                     <PntType>4</PntType>
                 </Start>
                 <End>
                     <Master>10.059000</Master>
                     <Slave>29.450302</Slave>
                     <PntType>4</PntType>
                 </End>
                 <Symmetry>0.5</Symmetry>
                 <FunctionType>1</FunctionType>
             </Segment>
             <Segment>
                 <IdRef>1</IdRef>
                 <Start>
                     <Master>0</Master>
                     <Slave>0</Slave>
                     <PntType>4</PntType>
                 </Start>
                 <End>
                     <Master>0</Master>
                     <Slave>0</Slave>
                     <PntType>4</PntType>
                 </End>
                 <Symmetry>0.5</Symmetry>
                 <FunctionType>1</FunctionType>
             </Segment>
         </segments>

如果要比較Start和End中的Master和Slave標簽,可以使用這種方法:

bool CompareXmls(XElement first, XElement second)
{
        var firstStart = first.Element("Start");
        var firstEnd = first.Element("End");
        var firstStartMaster = firstStart.Element("Master").Value;
        var firstStartSlave = firstStart.Element("Slave").Value;
        var firstEndMaster = firstEnd.Element("Master").Value;
        var firstEndSlave = firstEnd.Element("Slave").Value;

        var secondStart = second.Element("Start");
        var secondEnd = second.Element("End");
        var secondStartMaster = secondStart.Element("Master").Value;
        var secondStartSlave = secondStart.Element("Slave").Value;
        var secondEndMaster = secondEnd.Element("Master").Value;
        var secondEndSlave = secondEnd.Element("Slave").Value;

        bool areEqual = firstStartMaster == secondStartMaster
            && firstStartSlave == secondStartSlave
            && firstEndMaster == secondEndMaster
            && firstEndSlave == secondEndSlave;

        return areEqual;
    }

編輯:想要比較已經排序的列表,並且您可以將一個列表中的第一個項目與另一個列表中的第一個項目進行比較,依此類推,您可以使用 LINQ .Zip 方法將 XElements 分組為一個匿名對象,然后使用 LINQ .All循環遍歷項目並比較:

var res = firstList.Zip(secondList, (a, b) => new { First = a, Second = b }).All(x=>CompareXmls(x.First,x.Second));

就個人而言,我可能會使用 for 循環來遍歷兩個列表並比較每個項目,但如果您想使用單行 LINQ,則可以使用上述方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM