0

DETAIL複数の要素を含む XML ドキュメントがあります。各DETAIL要素にはUpdateDateDescription属性を含めることができます。たとえば、短い例を次に示します。

<MyDocument>
    <DETAIL UpdateDate='18-Sept-2012' />
    <DETAIL UpdateDate='18-Sept-2012' Description='A description goes here' />
</MyDocument>

すべての属性が子要素になるように XML を変換する必要があります。たとえば、次のようになります。

<MyDocument>
    <DETAIL>
        <UpdateDate>18-Sept-2012</UpdateDate>
    </DETAIL>
    <DETAIL>
        <UpdateDate>18-Sept-2012</UpdateDate>
        <Description>A description goes here</Description>
    </DETAIL>
</MyDocument>

XML を変換するために使用している方法は次のようになります。

Function ProcessDetail(ByVal xmlText As String) As String
    Dim xmlDoc As New XmlDocument()
    xmlDoc.LoadXml(xmlText)
    Dim sDetail As New StringBuilder()
    sDetail.Append("<DETAIL>")
    For Each detailNode As XmlNode In xmlDoc.SelectNodes("//DETAIL")
        If Not detailNode.Attributes Is Nothing Then
            For Each attribute As XmlAttribute In detailNode.Attributes
                sDetail.Append("<" & attribute.Name.ToUpper & ">" & attribute.Value & "</" & attribute.Name.ToUpper & ">")
            Next
        End If
    Next
    sDetail.Append("</DETAIL>")
    Return sDetail.ToString()
End Function

このメソッドは、ほとんどのDETAIL要素に対して正常に機能しますが、次のような要素を変換しようとすると失敗します。

<DETAIL Description='Problem:<br><br>CRS750 dumps when panel F is opened' />

<属性値にandなどの文字が予約されているため、次のような>例外がスローされます。

error message - `'<', hexadecimal value 0x3C, is an invalid attribute character. Line 1, position 1326.`

DETAIL例外をスローせずにこれらのタイプの要素を変換できるようにメソッドを修正するにはどうすればよいですか?

4

1 に答える 1

1

これは有効な XML ではないため、標準の XML パーサー ライブラリを使用して解析することは事実上不可能です。可能であれば、XML を生成するコードを修正して、予約文字が適切にエスケープされるようにします (たとえば>、 に変更する必要があります&gt;)。これを修正するには、文字列連結によって XML を直接構築するのではなく、XmlDocumentまたはなどの XML パーサー オブジェクトを使用して XML を生成する必要があります。XDocumentただし、それを変更するのが難しすぎる場合は、少なくとも、HttpServerUtility.HtmlEncodeXML ドキュメント文字列に連結する前に各ノード値を呼び出す必要があります。

"<DETAIL Description='"XML を生成するコードを修正できない場合は、文字列の先頭から を削除し、文字列"' />"の末尾からを削除して、無効な XML を手動で解析する必要があります。ただし、それが完全な文字列であり、常に同じ正確な開始形式と終了形式を持っている場合にのみ機能します。

于 2012-09-25T15:04:26.287 に答える