代码之家  ›  专栏  ›  技术社区  ›  Spurious

加载XML无效:在文档的顶层无效

  •  0
  • Spurious  · 技术社区  · 6 年前

    .resx 文件使用 Excel VBA .

    这个 .resx公司

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <!-- 
        Microsoft ResX Schema 
    
        Version 2.0
    
        The primary goals of this format is to allow a simple XML format 
        that is mostly human readable. The generation and parsing of the 
        various data types are done through the TypeConverter classes 
        associated with the data types.
    
        Example:
    
        ... ado.net/XML headers & schema ...
        <resheader name="resmimetype">text/microsoft-resx</resheader>
        <resheader name="version">2.0</resheader>
        <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
        <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
        <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
        <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
        <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
            <value>[base64 mime encoded serialized .NET Framework object]</value>
        </data>
        <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
            <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
            <comment>This is a comment</comment>
        </data>
    
        There are any number of "resheader" rows that contain simple 
        name/value pairs.
    
        Each data row contains a name, and value. The row also contains a 
        type or mimetype. Type corresponds to a .NET class that support 
        text/value conversion through the TypeConverter architecture. 
        Classes that don't support this are serialized and stored with the 
        mimetype set.
    
        The mimetype is used for serialized objects, and tells the 
        ResXResourceReader how to depersist the object. This is currently not 
        extensible. For a given mimetype the value must be set accordingly:
    
        Note - application/x-microsoft.net.object.binary.base64 is the format 
        that the ResXResourceWriter will generate, however the reader can 
        read any of the formats listed below.
    
        mimetype: application/x-microsoft.net.object.binary.base64
        value   : The object must be serialized with 
                : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.soap.base64
        value   : The object must be serialized with 
                : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.bytearray.base64
        value   : The object must be serialized into a byte array 
                : using a System.ComponentModel.TypeConverter
                : and then encoded with base64 encoding.
        -->
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <data name="Change_phone_number" xml:space="preserve">
        <value>Change phone number</value>
      </data>
      <data name="Change_your_mobile_phone_number" xml:space="preserve">
        <value>Please change your mobile phone number</value>
      </data>
    </root>
    

    Sub ReadXMLDateFromFiles()
    Dim ws As Worksheet
    Dim XDoc As New MSXML2.DOMDocument
    Dim i As Long
    
    Set ws = ThisWorkbook.Sheets("Files")
    XDoc.async = False: XDoc.validateOnParse = False
    
    i = 2
    Do While ws.Cells(1, i).Value <> ""
        XDoc.Load ws.Cells(1, i).Value
        XDoc.LoadXML ws.Cells(1, i).Value
        Debug.Print XDoc.parseError.reason, XDoc.parseError.ErrorCode
        i = i + 1
    Loop
    Set XDoc = Nothing
    End Sub
    

    如标题所述,错误:

    Error message: Invalid at the top level of the document
    Error code: -1072896682
    

    删除评论部分以及 <xsd:>

    我已经尝试过用其他XML文件编写的代码,它很管用。我已经将文件的结尾改为xml,但它不起作用。

    我不知道还能做什么。文件保存为UTF8。我可以在Webstorm中打开它没有问题,它正在被识别。

    我想使用的XPath: XDoc.SelectNodes("/root/data[@name='Change_phone_number']/value")

    notepad++ : enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   QHarr    6 年前

    下面的方法非常适合我,从桌面上的文件中读取xml

    Option Explicit
    Public Sub testing()
        Dim xDoc As New MSXML2.DOMDocument60, node As IXMLDOMElement
    
        Set xDoc = New MSXML2.DOMDocument60
    
        With xDoc
            .async = False
            .validateOnParse = True
    
            If Not xDoc.Load("C:\Users\User\Desktop\Testing.xml") Then
                Debug.Print .parseError.reason, .parseError.ErrorCode
                Exit Sub
            End If
    
            Set node = xDoc.SelectSingleNode("//data[@name='Change_phone_number']")
    
            If Not node Is Nothing Then
                node.Text = "Ain't nobody got time for that"
            End If
            Debug.Print node.Text
        End With
    End Sub
    
    推荐文章