0

ここでは、XML に基づく検証について簡単に説明します。ネストされた DTD を参照する XML ファイルを解析しようとしています。つまり、XML ファイルは、他の DTD を参照する DTD を参照しています。

私が得るエラーは、Config の名前空間プレフィックス SomeNameSpace が定義されていないことです。私がやろうとしているのは、lxml の API である etree.parse を使用して xml を解析することだけです。私の質問は:

  1. 検証をオフにすることはできますか (xml が正しいと想定しています)。
  2. どのタグについても文句を言わないように、ネストされたすべての DTD を lxml に正確に提供するにはどうすればよいですか?

同様の質問がありますが、この質問に答えるものはありません。

4

2 に答える 2

1

しばらく前に、私は似たようなことをしようとしましたが、解決策を見つけることができませんでした. 最終的に、XML ファイルを開き、正規表現を使用して DTD を検索する以下のスクリプトを作成しました。また、コマンド ラインで DTD パスを取得するためのオーバーライドもあり、これは私が必要としていたものです。

lxml がネストされた DTD を処理する場合、以下のコードが機能するはずです。

正直なところ、ファイルを自分で読み取るのは少しハックだと思いましたが、それしか方法がありませんでした。

import re
import sys
import os.path
import codecs
from lxml import etree

def main(args):
    if len(args)<1:
        print("Not enough arguments given.  Expected:")
        print("\tvalidatexml <xml file name> [<dtd file name>]\n")
        exit(1)

    dtdRe = re.compile('.*<!DOCTYPE .* ["\'](.*\.dtd)["\']>.*')
    theDtd = None
    inFile = args[0]
    fdir = os.path.abspath(os.path.dirname(inFile))
    if len(args)==2:
        theDtd = os.path.abspath(args[1])
    else:
        with codecs.open(args[0], 'r', 'utf-8') as inf:
            for ln in inf:
                mtch = dtdRe.match(ln)
                if mtch:
                    if os.path.isabs(mtch.group(1)):
                        theDtd = mtch.group(1)
                    else:
                        theDtd = os.path.abspath(fdir + '/' + mtch.group(1))
                    break
    if theDtd is None:
        print("No DTD specified!")
        exit(2)

    if not os.path.exists(theDtd):
        print("The DTD ({}) does not exist!".format(theDtd))
        exit(3)

    print('Using DTD:', theDtd)

    parser = etree.XMLParser(dtd_validation=True)
    dtd = etree.DTD(open(theDtd))
    tree = etree.parse(args[0])

    valid = dtd.validate(tree)
    if (valid):
        print("XML was valid!")

    else:
        print("XML was not valid:")
        print(dtd.error_log.filter_from_errors())


if __name__ == '__main__':
    main(sys.argv[1:])
于 2013-06-17T22:44:00.067 に答える
0

Beautiful Soupでパースしてみては?エラーがまだ存在しますか?

于 2013-06-17T22:32:40.817 に答える