2

私は、安らかな Web サービスの結果を新しい形式の XML ドキュメントに変換するという任務を負っています。

変換する html/xhtml の例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>OvidWS Result Set Resource</title>
    </head>
    <body>
        <table id="results">
            <tr>
                <td class="_index">
                  <a class="uri" href="REDACTED">1</a>
                </td>
                <td class="au">
                  <span>GILLESPIE JB</span>
                  <span>KUKES RE</span>
                </td>
                <td class="so">A.M.A. American Journal of Diseases of Children</td>
                <td class="ti">Acetylsalicylic acid poisoning with recovery.</td>
                <td class="ui">20267726</td>
                <td class="yr">1947</td>
              </tr>
              <tr>
                <td class="_index">
                  <a class="uri" href="REDACTED">2</a>
                </td>
                <td class="au">BASS MH</td>
                <td class="so">Journal of the Mount Sinai Hospital, New York</td>
                <td class="ti">Aspirin poisoning in infants.</td>
                <td class="ui">20265054</td>
                <td class="yr">1947</td>
              </tr>
        </table>  
    </body>
</html>

理想的には、クラス属性としてリストされているものをすべて取り、それを要素名にするだけです。「クラス」属性がない場合は、アイテムとしてマークしたいだけです。

これは私が探している変換です:

<results>
    <citation>
        <_index>
            <uri href="REDACTED">1</uri>
        </_index>
        <au>
            <item>GILLESPIE JB</item>
            <item>KUKES RE</item>
        </au>
        <so>A.M.A. American Journal of Diseases of Children</so>
        <ti>Acetylsalicylic acid poisoning with recovery.</ti>
        <ui>20267726</ui>
        <yr>1947</yr>
    </citation>
    <citation>
        <_index>
            <uri href="REDACTED">2</a>
        </_index>
        <au>BASS MH</au>
        <so>Journal of the Mount Sinai Hospital, New York</so>
        <ti>Aspirin poisoning in infants.</ti>
        <ui>20265054</ui>
        <yr>1947</yr>
    </citation>
</results>  

ここで、ノードの名前を変更できる小さなコードを見つけました。

    Public Shared Function RenameNode(ByVal e As XmlNode, newName As String) As XmlNode
        Dim doc As XmlDocument = e.OwnerDocument
        Dim newNode As XmlNode = doc.CreateNode(e.NodeType, newName, Nothing)
        While (e.HasChildNodes)
            newNode.AppendChild(e.FirstChild)
        End While
        Dim ac As XmlAttributeCollection = e.Attributes
        While (ac.Count > 0) 
            newNode.Attributes.Append(ac(0))
        End While
        Dim parent As XmlNode = e.ParentNode
        parent.ReplaceChild(newNode, e)
        Return newNode
    End Function

しかし、XmlAttributeCollection を反復処理するときに問題が発生します。何らかの理由で、td ノードの 1 つを見ると、ソースには表示されない 2 つの属性、rowspan と colspan が魔法のように表示されます。これらの属性は、消費されたときに「クラス」属性のように属性リストから消えないため、イテレータをいじっているようです。代わりに、属性の値が消費されます ("1" から "" に変更されます)。これにより、無限ループが発生します。

それらは「XMLUnspecifiedAttribute」タイプであることに注意してください。ただし、ループを変更してそれを検出すると、次のようになります。

While (ac.Count > 0) And Not TypeOf (ac(0)) Is System.Xml.XmlUnspecifiedAttribute
    newNode.Attributes.Append(ac(0))
End While

次のエラーが表示されます。

System.Xml.XmlUnspecifiedAttribute is not accessible in this context because it is 'friend'

なぜこれが起こっているのか、それを回避する方法はありますか?

4

1 に答える 1