pythonのXMLドキュメントの良構造性と有効性の検証


###一.XMLドキュメントの構造良好性の検証
構造の良いxmlドキュメントは、次のルールを遵守する必要があります.
1.すべての開始ラベルに対応する終了ラベルが必要
2.要素はネストできますが、重ね合わせはできません
3.ルート要素が1つしかない
4.属性値には引用符を使用する必要があります
5.1つの要素に同じ属性名の属性を2つ持つことはできません.
6.コメントはラベル内に表示できません
7.エスケープされていない「<」または「$」は、要素および属性の文字に表示されません.
2.XMLドキュメントが良構造であるかどうかを確認する方法
test.xmlは次のとおりです.
<?xml version="1.0" encoding="utf-8"?>
<root>
 <person age="18">
    <name>hzj</name>
    <sex>man</sex>
 </person>
 <person age="19" des="hello">
    <name>kiki</name>
    <sex>female</sex>
 </person>
</root>

方法:ElementTreeモジュールを例にparseメソッドを直接使用します.間違いを報告しなければ、このXMLが良構造であることを示します.
#encoding=gbk
from xml.etree import ElementTree as ET
try:
    ET.parse('test.xml')
    print '       XML  '
except Exception,e:
    print '        XML  '
    print '    :',e
実行結果:
       XML  
ルートラベルの最後のをに変更
実行結果:
        XML  
    : no element found: line 11, column 6
より詳細については、lxmlモジュールを使用します.
lxmlのインストール方法はブログを参照してください.
http://blog.csdn.net/shirdrn/article/details/7030026
import  lxml.etree as ET
try:
    ET.parse('test.xml')
    print '       XML  '
except Exception,e:
    print '        XML  '
    print '    :',e
実行結果:
        XML  
    : Premature end of data in tag root line 11, line 11, column 7

3.XMLドキュメントの有効性の検証
pythonの標準ライブラリにはXMLドキュメントの有効性検証機能が含まれていないので、以下に説明する方法はlxmlモジュールに基づいています.
#3.1.DTD検証
DTD(Document Type Definition)ファイルでは、XMLドキュメントの要素、要素タイプ、およびコンテンツフォーマットについて説明します.
構成構造と間の関係は、対応するルールを定義します.
例の説明:
#encoding=utf-8
import lxml.etree as ET
from StringIO import StringIO
f=StringIO("<!ELEMENT empty EMPTY >")
"""
  DTD  ,XML              。           :
  <!ELEMENT        >
    
  <!ELEMENT      (    )>
        :EMPTY(   ),ANY(  ),Mixed(  ),Children(   )
     DTD   :  empty  
"""
dtd=ET.DTD(f)
xml=ET.XML("<empty/>") #     
print dtd.validate(xml)

xml=ET.XML("<empty>Hello LXML</empty>") #      ,     
print dtd.validate(xml)
print dtd.error_log   #      
実行結果:
True
False
<string>:1:0:ERROR:VALID:DTD_NOT_EMPTY: Element empty was declared EMPTY this one has content
ここで注意する必要があります.
f=StringIO("<!ELEMENT empty EMPTY >")

!Elementとの間にスペースを入れないでください.スペースが表示されると、次のようにエラーが表示されます.
Traceback (most recent call last):
  File "F:\python workspace\Helloworld\xml\dtd.py", line 13, in <module>
    dtd=ET.DTD(f)
  File "dtd.pxi", line 41, in lxml.etree.DTD.__init__ (src/lxml/lxml.etree.c:113574)
  File "dtd.pxi", line 114, in lxml.etree._parseDtdFromFilelike (src/lxml/lxml.etree.c:114222)
lxml.etree.DTDParseError: error parsing DTD
#3.2 XML Schema検証
XML Schemaモードについてよく知っておくと、XML Schema言語はXML Schema Definition(XSD)W 3 Cオンラインドキュメントとも呼ばれます.
クリックしてリンクを開く
例の説明:
import lxml.etree as ET
from StringIO import StringIO
f=StringIO("""
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
    <xs:element name="to" type="xs:string"/>
    <xs:element name="from" type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>
</xs:schema>
""")

xmlschema_doc=ET.parse(f)
xmlschema=ET.XMLSchema(xmlschema_doc)
valid_str=StringIO("""
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
""")
xml=ET.parse(valid_str)
print xmlschema.validate(xml)

valid_str=StringIO("""
<note>
<from>John</from>
<to>George</to>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
""")
xml=ET.parse(valid_str)
print xmlschema.validate(xml)
print xmlschema.error_log


実行結果:
True
False
<string>:3:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element 'from': This element is not expected. Expected is ( to ).
エラーの原因は明らかです.私が定義したXML Schema要素には順序があるからです.