簡體   English   中英

vb.net和xml根據上一個節點的內部文本選擇節點

[英]vb.net and xml select node based on innertext of previous node

我的XML如下所示:

<Document type="ContentPage">
<Fields>
    <Field name="FaqCategory" type="dropdown" title="Select Category:" index="FaqCategory" list="\Lists\FaqCategory" required="true">
        Online Experience
    </Field>
    <Field name="FaqSubCategory" type="dropdown" title="Select Sub Category" list="\Lists\FaqSubCategory" required="true">
        Using the site
    </Field>
    <Field name="FaqQuestion" type="text" title="Enter FAQ Question:" required="true">
        How do I find articles on the site?
    </Field>
    <Field name="FaqAnswer" type="richtext" title="Enter FAQ Answer:" editorProfile="Advanced" required="true">
        Answer to: How do I find articles on the site?
    </Field>
</Fields>
<Placeholders />
<Indexes />

這些都在XML對象數組中,我需要對數組進行排序並(顯然)為此站點設置FAQ部分。 我遇到的問題是,由於這不是1個xml文檔而是xml文檔的集合,因此我很難按主要類別>子類別進行排序/分離。

到目前為止,這里是我獲得主要類別的地方:

    Protected Sub getFaqData(ByVal DocArray() As CMSWS.CMSDocumentRecord)
    Dim mainFaqCategoryItem As String = ""
    Dim mainCategoryList As New List(Of String)
    For Each Doc As CMSWS.CMSDocumentRecord In DocArray
        xml.LoadXml(Doc.Xml)
        Try
            mainFaqCategoryItem = CType(xml.SelectSingleNode("//Fields/Field[@name='FaqCategory']").InnerText, String)
            If Not mainCategoryList.Contains(mainFaqCategoryItem) Then
                mainCategoryList.Add(mainFaqCategoryItem)
            End If
        Catch ex As Exception
            Response.Write("ERROR getting the main category")
        End Try
    Next

    For Each item In mainCategoryList
        outputsubs(item, DocArray)
    Next
End Sub

這是獲取子類別的開始,並且讓我陷入困境:

    Protected Sub outputsubs(ByVal item As String, ByVal DocArray() As CMSWS.CMSDocumentRecord)
    Dim subFaqCategoryItem As String = ""
    Dim subcategoryList As New List(Of String)
    'Add the main Category to the HTML output:
    lblFaq.Text = lblFaq.Text & "<h1>" & item & "</h1>"

    For Each Doc As CMSWS.CMSDocumentRecord In DocArray
        xml.LoadXml(Doc.Xml)
        Try
            'If xml.SelectSingleNode("//Fields/Field[@name='FaqCategory']").InnerText = item Then
            subFaqCategoryItem = CType(xml.SelectSingleNode("//Fields/Field[@name='FaqCategory']").InnerText, String)
            If Not subcategoryList.Contains(subFaqCategoryItem) Then
                subcategoryList.Add(subFaqCategoryItem)
            End If
            'End If

        Catch ex As Exception
            Response.Write("ERROR getting the main category")
        End Try
    Next
    For Each subItem In subcategoryList
        lblFaq.Text += "<h2><a name=""subCategory"" style=""text-decoration:none;""><span class=""FAQPlusMinus""> + </span>" & subItem & "</a></h2>"
    Next
End Sub

我的想法是,我需要將嵌套的for-each循環設置為大約3個級別,以使其正常工作,但是我無法理解。 特別是因為它不是一個XML文檔。 用於顯示主要類別的作品

我通過反復試驗找到了解決方案,不確定是否有人會遇到類似情況,但這就是我的工作方式:

Protected Sub outputFaqData(ByVal DocArray() As CMSWS.CMSDocumentRecord)

    Dim mainFaqCategoryItem As String = ""
    Dim mainCategoryList As New List(Of String)
    Dim xmlDocText As New StringBuilder()
    xmlDocText.Append("<Documents>")
    For Each cmsDoc As CMSWS.CMSDocumentRecord In DocArray
        xmlDocText.Append(cmsDoc.Xml)
    Next
    xmlDocText.Append("</Documents>")
    Dim doc As New XmlDocument()
    doc.LoadXml(xmlDocText.ToString())
    Dim nav As XPathNavigator = doc.CreateNavigator()
    Dim exp As XPathExpression = nav.Compile("//Documents/Document/Fields")
    exp.AddSort("Field[@name='FaqCategory']", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text)
    exp.AddSort("Field[@name='FaqSubCategory']", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text)
    Dim leftNavHTML As New StringBuilder()
    Dim faqHTML As New StringBuilder()
    Dim currentCategoryName As String = ""
    Dim currentFaqSubCategory As String = ""
    Dim isFirstPass As Boolean = True
    For Each item As XPathNavigator In nav.Select(exp)
        Dim FaqCategory As String = item.SelectSingleNode("Field[@name='FaqCategory']").InnerXml
        Dim FaqSubCategory As String = item.SelectSingleNode("Field[@name='FaqSubCategory']").InnerXml
        Dim FaqQuestion As String = item.SelectSingleNode("Field[@name='FaqQuestion']").InnerXml
        Dim FaqAnswer As String = item.SelectSingleNode("Field[@name='FaqAnswer']").InnerXml
        Dim isNewFaqCategory As Boolean = False
        Dim isNewFaqSubCategory As Boolean = False
        If Not currentCategoryName.Equals(FaqCategory) Then
            isNewFaqCategory = True
        End If
        If Not currentFaqSubCategory.Equals(FaqSubCategory) Then
            isNewFaqSubCategory = True
        End If
        If Not isFirstPass And (isNewFaqSubCategory Or isNewFaqCategory) Then
            faqHTML.Append("</div>")
        End If
        If isNewFaqCategory Then
            currentCategoryName = FaqCategory
            If Not isFirstPass Then
                faqHTML.Append("</div><div id=""alp_rightcolumn"">")
            End If
            leftNavHTML.Append("<h4 class='FaqCategory'>" & FaqCategory & "</h4>")
            faqHTML.Append("<h1 class='FaqCategory'>" & FaqCategory & "</h1>")
        End If
        If Not isFirstPass And (isNewFaqSubCategory Or isNewFaqCategory) Then
            faqHTML.Append("</div>")
        End If
        If isNewFaqSubCategory Then
            faqHTML.Append("<div class='FaqSubCategoryDiv'>")
        End If
        Dim QAID As String = Guid.NewGuid().ToString
        If isNewFaqSubCategory Then
            currentFaqSubCategory = FaqSubCategory
            leftNavHTML.Append("<div class='FaqSubCategory'><a href='#" & QAID & "'>" & FaqSubCategory & "</a></div>")
            'faqHTML.Append("<br/>:FIN")
            faqHTML.Append("<h2 class='FaqSubCategory'><a name='" & QAID & "'><span class='FAQPlusMinus'> + </span> " & FaqSubCategory & "</a></h2>")
        End If
        If isNewFaqSubCategory Then
            faqHTML.Append("<div class='QuestionsBox'>")
        End If
        faqHTML.Append("<a class='FAQQuestion' href='#' onClick=""showAnswer('" & QAID & "');return false;"">" & FaqQuestion & "<img src='/images/FAQ_Arrow.gif'/> </a>")
        faqHTML.Append("<div class='FAQAnswer " & QAID & "'>" & FaqAnswer & "</div>")
        isFirstPass = False
    Next
    faqHTML.Append("</div>")
    faqHTML.Append("</div>")
    litFAQLeftColumn.Text = leftNavHTML.ToString
    litFAQ.Text = faqHTML.ToString

End Sub

暫無
暫無

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

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