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' />

由于它在属性值中保留了诸如<和之类的字符,>因此它会抛出一个异常:

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

如何修复我的方法,以便它可以在DETAIL不引发异常的情况下转换这些类型的元素?

4

1 回答 1

1

这不是有效的 XML,因此实际上无法解析,当然也不能使用任何标准的 XML 解析器库。如果可能,修复生成 XML 的代码,以便正确转义保留的字符(例如>,应更改为&gt;)。为了解决这个问题,应该使用一个 XML 解析器对象(例如XmlDocumentor XDocument)来生成 XML,而不是直接通过字符串连接来构建它。但是,如果更改它太难,至少应该HttpServerUtility.HtmlEncode在将每个节点值连接到 XML 文档字符串之前调用它。

如果无法修复生成 XML 的代码,您将不得不自己手动解析无效的 XML,方法是删除"<DETAIL Description='"字符串开头的 和"' />"结尾的 。但这只有在它是完整的字符串并且它始终具有相同的确切开始和结束格式时才有效。

于 2012-09-25T15:04:26.287 回答