查找XML中关键字的计数

时间:2016-05-25 04:59:00

标签: c# asp.net .net xml winforms

Xml可以有这样的格式

<root>
    <child1>
        Value1
    </child1>
    <child2>
            <child3>
                Value2
            </child3>
            <child4>
                    <child5>
                        Value1
                    </child5>
            </child4>
    </child2>
    <child6>
        Value1
    </child6>
</root>

这里Value1写了3次,所以count应该是3。

或者Xml可以有这样的格式:

<root>
    <child1 value="Value1" />
    <child2 value="Value2"/>
    <child3 value="Value1" />
    <child4 value="Value1"/>
    <child5 value="Value3" />
    <child6 value="Value4"/>    
</root>

此处Value1的计数为3。

因此Xml可以有任何格式,我想计算xml中的特定关键字计数。

请指导!

  

编辑:问题不可能是您提到的链接重复,这里我不知道xml的深度,例如它可能有   一个孩子或多个孩子,其中关键字可能会或可能不会出现。   我想遍历所有节点而不知道每个节点的深度**

3 个答案:

答案 0 :(得分:1)

XmlDocument readDoc = new XmlDocument();
readDoc.Load(MapPath("your xml path"));

int NoCount = readDoc.SelectNodes("child[. = \"Value1\"]").Count;

这可以检查所有值,(例如,Value1,Valu2等)

答案 1 :(得分:1)

我建议您使用XDocument

XDocument doc = XDocument.Load(filename);       
var count = doc.Descendants()                                                     // flattens the structure
              .Where(x=> (!x.HasElements &&((string)x.Value).Trim() == "Value1")
                            || (x.Attribute("value") != null 
                                && x.Attribute("value").Value == "Value1")
                         )                                                        // filter based on value
              .Count();                                                           // Take count

选中此Demo

答案 2 :(得分:0)

您可以看到以下代码。我不擅长C#,因此代码是用VB编写的。

Public Class Form1
Private Function SearchKeyword(s_Node As String, s_Keyword As String) As Integer
    Dim doc As New XmlDocument()
    Dim i_CurPos As Integer = 1
    Dim s_InnerText As String
    Dim s_File As String = "E:\test.xml"
    doc.Load(s_File)
    Dim nodelist As XmlNodeList = doc.SelectNodes(s_Node)
    For Each node As XmlElement In nodelist
        s_InnerText = node.InnerText

        For i = 1 To CInt(Len(s_InnerText) / Len(s_Keyword))
            If InStr(i_CurPos, s_InnerText, s_Keyword) > 0 Then
                SearchKeyword += 1
                i_CurPos = InStr(i_CurPos, s_InnerText, s_Keyword) + 1
            End If
        Next
    Next
    Return SearchKeyword
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MsgBox(SearchKeyword("root", "Value1"))
End Sub
End Class