【问题标题】:XML to String BuilderXML 到字符串生成器
【发布时间】:2012-09-17 03:09:56
【问题描述】:

我有一个包含多个 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' />

由于在属性值中保留了&lt;&gt;等字符,所以会抛出异常:

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

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

【问题讨论】:

  • 我对您的问题进行了重大修改,以更清楚地说明我认为您的问题是什么。请查看并告诉我您是否认为我正确理解了您的问题。

标签: xml vb.net xml-parsing xsd


【解决方案1】:

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

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

【讨论】:

  • 我在开头和结尾插入了一个详细标签以使其有效。所以我的字符串生成器看起来像 18th Sept 。我正在手动添加 DETAIL & UPDATE 元素。
  • 请展示一个重复问题的简单代码示例,我将向您展示如何解决它。请将示例添加到您的原始问题中,而不是放在评论中。
  • 简单的答案是您应该使用XmlDocumentXDocument 插入DETAIL 元素,而不是简单地使用StringBuilder 连接字符串。
  • 我可以给你发我的代码吗?由于字符限制,无法在此处粘贴。非常感谢您的帮助!
  • Stack Overflow 的目的不仅是为了回答您的个人问题,而​​且是为了让将来有类似问题的其他人受益。对这个问题半问半答对任何人都没有好处。我不是要您将整个代码复制到您的问题中。我只是建议您创建一个具有相同问题的简单代码示例。我将更新我的答案以说明我的意思。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多