Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python如何检查打开和关闭标记_Python_Xml_Xml Parsing_Tags - Fatal编程技术网

python如何检查打开和关闭标记

python如何检查打开和关闭标记,python,xml,xml-parsing,tags,Python,Xml,Xml Parsing,Tags,我有一个类似XML的文件,但它不是XML或HTML 文件示例: <config-file> name myconfig date 3-2-2016 </config-file> <client> <"ABC - CDE & 123"> </"ABC - CDE & 123"> </client> 名称myconfig 日期:2016年3月2日 我们经常编辑这个文件,把打开

我有一个类似XML的文件,但它不是XML或HTML

文件示例:

<config-file>
   name myconfig
   date 3-2-2016
</config-file>
  <client>
   <"ABC - CDE & 123">
   </"ABC - CDE & 123">
  </client>

名称myconfig
日期:2016年3月2日
我们经常编辑这个文件,把打开或关闭的过程搞糟。未关闭或甚至未找到位置“”。 试图找到一种解析文件的好方法,以确保文件已打开和关闭。 我在想:

1-循环通过每一行,如果以
<+任何字符>
,并确保它有一个结束符
如果没有,则抛出模式错误


欢迎提供任何帮助。

您已经掌握了基本知识。您只关心三种情况:

  • 开始标记
  • 结束标记
  • 其他一切(忽略)
  • 使用正则表达式查找开始和结束标记;确保begin表达式排除斜杠作为第二个字符。现在,制作一个简单的堆栈:一个字符串列表就可以了。此列表将保存打开的标记

    行动:

    • 开始标记:提取标记(去掉尖括号)。将其推到列表的前面
    • 结束标记:提取标记(去掉尖括号和前导斜杠)。检查此标记是否与列表的前面相同。如果是的话,把它打开。如果没有,则发出错误消息。如果列表中没有任何内容,则有人试图在没有打开标签的情况下关闭标签;发布消息
    • EOF:当输入用完时,检查列表。任何剩余的字符串都是未关闭的标记。发布消息
    请注意,这还允许您进行一些恢复。您可以扫描列表,以查看无效的close标记是否与堆栈下游的某个标记匹配。这表示重叠块。你可以寻找一个相近的匹配,暗示拼写错误。如果你在没有可能打开的情况下关闭,你可以发出一条消息并忽略它。这些步骤使您有机会发现多个错误

    哦,见鬼。。。我已经做了很多次了

    stack = []
    
    with open("parse_test_1.txt", 'r') as parse_file:
        for line in parse_file:
            print "INPUT LINE:", line
            ltag = line.find('<')
            if ltag > -1:
                rtag = line.find('>')
                if rtag > -1:
                    # Found left and right brackets: grab tag
                    tag = line[ltag+1: rtag]
                    open_tag = tag[0] != '/'
                    if open_tag:
                        # Add tag to stack
                        stack.append(tag)
                        print "TRACE open", stack
                    else:
                        tag = tag[1:]
                        if len(stack) == 0:
                            print "No blocks are open; tried to close", tag
                        else:
                            if stack[-1] == tag:
                                # Close the block
                                stack.pop()
                                print "TRACE close", tag, stack
                            else:
                                print "Tried to close", tag, "but most recent open block is", stack[0]
                                if tag in stack:
                                    stack.remove(tag)
                                    print "Prior block closed; continuing"
    
    if len(stack):
        print "Blocks still open at EOF:", stack
    
    stack=[]
    打开(“parse_test_1.txt”,“r”)作为parse_文件:
    对于parse_文件中的行:
    打印“输入行:”,第行
    ltag=行。查找(“”)
    如果rtag>-1:
    #找到左括号和右括号:抓取标签
    标签=行[ltag+1:rtag]
    打开标签=标签[0]!='/'
    如果打开标签:
    #向堆栈添加标记
    stack.append(标记)
    打印“跟踪打开”,堆栈
    其他:
    标签=标签[1:]
    如果len(stack)==0:
    打印“没有打开的块;尝试关闭”,标记
    其他:
    如果堆栈[-1]==标记:
    #关闭街区
    stack.pop()
    打印“跟踪关闭”、标记、堆栈
    其他:
    打印“试图关闭”,标记“但最近打开的块是”,堆栈[0]
    如果堆栈中有标记:
    堆栈。删除(标记)
    打印“上一块已关闭;继续”
    如果len(堆栈):
    打印“EOF处仍打开的块:”,堆栈
    
    呃,听起来很乱。您是否可以修改使用此文件的任何工具,以便它可以使用真正的XML或JSON?这是我们可以使用任何验证程序的最初目标,但由于许多其他模块都依赖于此,因此无法更改此目标。这是不幸的。祝你好运非常感谢你的帮助。这是很棒的东西。