使用SAX解析器或DOM解析器解析complexType?哪一个更有效率?

时间:2015-05-28 05:48:36

标签: xml parsing dom xsd sax

我需要解析以下 XSD 代码段

Sub TransposeColumnA()
Dim X As Long
For X = 1 To Range("A" & Rows.Count).End(xlUp).Row
    Range("B" & Range("B" & Rows.Count).End(xlUp).Row + 1).Resize(UBound(Split(Range("A" & X).Text, ";")) + 1, 1).Formula = Application.Transpose(Split(Range("A" & X).Text, ";"))
Next
End Sub

如果我使用 SAX解析器解析它,我将无法解析 complexType

应该使用 DOM解析器,还是有办法使用SAX解析器轻松解析complexType。

难度: -

  <xs:element name="BANT" type="tns:B"/>    
  <xs:complexType name="InqRq_Type">
    <xs:sequence>
      <xs:element name="Header" type="tns:Rq"/>
      <xs:element name="Data" type="tns:InqRqData_Type"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="RqHeader_Type"> 
    <xs:sequence>
         <xs:element name="Filler1" minOccurs="0" >
          <xs:simpleType >
          <xs:restriction base="xs:string">
          <xs:maxLength value="1"/>
      </xs:restriction>
      </xs:simpleType>
     </xs:element>
     <xs:element name="MsgLen" minOccurs="0" >
          <xs:simpleType >
          <xs:restriction base="xs:string">
          <xs:maxLength value="4"/>
      </xs:restriction>
      </xs:simpleType>
     </xs:element>
     <xs:element name="Filler2" minOccurs="0" >
          <xs:simpleType >
          <xs:restriction base="xs:string">
          <xs:maxLength value="2"/>
      </xs:restriction>
      </xs:simpleType>
     </xs:element>
     <xs:element name="MsgType" minOccurs="0" >
          <xs:simpleType >
          <xs:restriction base="xs:string">
          <xs:maxLength value="2"/>
      </xs:restriction>
      </xs:simpleType>
     </xs:element>
    <xs:element name="Filler3" minOccurs="0" >
          <xs:simpleType >
          <xs:restriction base="xs:string">
          <xs:maxLength value="4"/>
      </xs:restriction>
      </xs:simpleType>
    </xs:element>
        <xs:element name="CycleNum" minOccurs="0" >
          <xs:simpleType >
          <xs:restriction base="xs:string">
          <xs:maxLength value="6"/>
      </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name="MsgNum" minOccurs="0" >
          <xs:simpleType >
          <xs:restriction base="xs:string">
          <xs:maxLength value="6"/>
      </xs:restriction>
      </xs:simpleType>
    </xs:element>

给了我所有元素,甚至是complexType下的元素。那么,我如何获取complexType并将元素存储在其下,然后处理其余的信息。

1 个答案:

答案 0 :(得分:1)

使用DOM Parser,

    NodeList cL = doc.getElementsByTagName("xs:complexType"); 
    Node cN= cL.item(0);
    NodeList cNC= cN.getChildNodes();
    Element cE =(Element) cNC;


    NodeList eL=cE.getElementsByTagName("xs:element");
    for (int i = 0; i < eL.getLength(); i++)        
      {
         Node eN = eL.item(i);                      // ith element  
         NodeList eNC= eN.getChildNodes();
         Element eE= (Element) eNC;             
         //extract elements values here or loop other nodes like this               
       }

DOM将整个xml作为树结构加载到内存中进行解析,而SAX使用基于事件的解析,因此SAX在DOM上提供了良好的性能。对于像这样的小xml,您可以使用DOM,无论哪种方式都很容易。