2013-06-17 4 views
0

Существует краткое объяснение валидации на основе XML here. Я пытаюсь проанализировать XML-файл, который относится к вложенному DTD, т. Е. XML-файл относится к DTD, который относится к другим DTD.xml validation (DTD) с использованием lxml (python)

Ошибка, которую я получаю, это префикс пространства имен SomeNameSpace on Config не определен. Все, что я пытаюсь сделать, это разобрать xml, используя etree.parse, который является API на lxml. Мой вопрос:

  1. Могу ли я просто отключить проверку (я предполагаю, что xml правильный)?
  2. Как точно я могу предоставить lxml все вложенные DTD, поэтому он не жалуется ни на какие теги?

Я вижу похожие вопросы, но ничего не отвечает на этот вопрос.

ответ

0

Вы можете попробовать разобрать Beautiful Soup? Ошибки все еще существуют?

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:]) 
+0

Будет ли это работать, если dtd будет передан другим dtd? – Pradyot

Смежные вопросы