【问题标题】:Finding count of a keyword in an XML在 XML 中查找关键字的计数
【发布时间】:2016-05-25 04:59:00
【问题描述】:

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 的深度,例如它可能有 一个或多个孩子,其中可能出现或不出现关键字。 我想遍历所有节点而不知道每个节点的深度**

【问题讨论】:

  • 这不是此链接@vahidkargar 的副本,我已经编辑了问题
  • 这意味着问题是如何计算搜索字符串与属性或值匹配的节点?
  • @HariPrasad 是的。我们将在变量中输入一些关键字,并基于此检查该变量的出现次数。是的,关键字可以作为属性或值出现。
  • @Rahul 我添加了一个解释了什么的答案,你可以检查一下。

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


【解决方案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

【讨论】:

  • 很棒的哈里!只是想再问一件事,我们可以将这个属性从“值”更改为所有属性吗?谢谢
  • 你能帮我处理一下那个代码吗?因为我不知道用什么来代替“值”来检查所有属性。
  • 只要修改条件为(!x.HasElements &amp;&amp;((string)x.Value).Trim() == "Value1") || x.Attributes().Any(a=&gt;a.Value == "Value1"))
【解决方案2】:
XmlDocument readDoc = new XmlDocument();
readDoc.Load(MapPath("your xml path"));

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

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

【讨论】:

  • 你提到了来自 MSDN 的完全不相关的链接!
  • 请解释一下“XPath 示例”和查找关键字计数的相关性是什么?
【解决方案3】:

你可以看到下面的代码。我的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2013-01-13
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多