XML 文件???
xml 即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
里面的标签都是可以随心所欲的按照他的命名规则来定义的, 文件名为 roi.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <readingSession>
- <roi>
- <xCoord id="1">312</xCoord>
- <yCoord>355</yCoord>
- </roi>
- </readingSession>
- 第一行是XML序言,<?xml version="1.0"?>。这一行代码会告诉解析器和浏览器,这个文件应该按照1.0版本的XML规则进行解析。
- encoding = "utf-8"表示此XML文件采用utf-8的编码格式。
- 里面的标签都是自己命名定义的 只要符合这种包围的命名都可以 <></> 还有注意缩进。
- 解析xml文件第一步:
- #coding=utf-8
- import xml.dom.minidom
- #打开xml文档
- dom = xml.dom.minidom.parse('roi.xml')
- #得到xml文档元素对象
- root = dom.documentElement
获得了对象之后就可以运用一些对元素标签操作的语法,每一个像 <> 这样的标签 都是一个结点,而每一个结点都有它的 nodeName,nodeValue,nodeType 属性,写法是 root.nodeName 要注意了这些语法对大小写都是敏感的,错一个大小写都是不行的,一般都符合驼峰的格式。
顾名思义 nodename 就是结点的名字 也就是标签名,nodevalue 就是结点里面的值 或者数据 不过这个只对文本结点有效。第二步对 XML 文件进行操作,获取其中的值:
- #coding=utf-8
- import xml.dom.minidom
- #打开xml文档
- dom = xml.dom.minidom.parse('roi.xml')
- #得到xml文档元素对象
- root = dom.documentElement
- #开始操作
- #获取readSession标签集并且继续获取标签集中第一个readSession下的xCoord标签集
- roiX=root.getElementsByTagName('readingSession')[0].getElementsByTagName('roi')[0].getElementsByTagName('xCoord')
- #获取到了xCoord第一子集 的子元素的数据 将其打印 firstChild 在这里代表xCoord的文本内容 也是一个文本结点 将文本结点的数据打印
- print roiX[0].firstChild.data
- #还可以获取长度
- xLen = root.getElementsByTagName('readingSession').length
- print xLen
getElementsByTagName(标签名)这个函数就是用来通过标签名字获取
通过 getElementsByTagName(标签名)获取到了标签元素对象 如果这个标签有 id 属性 ="" 也可以获取这个标签中的 ID, 注意到 xCoord 中有一个 id 属性 直接 ID=roiX.
getAttribute("id") 就可以获取了
这里还有很多对其操作的方法 就不详细介绍了。接下来看看用 Python 遍历文件:import os
- #这是我的文件目录路径
- path = 'C:\Program Files\Java\jre-9.0.1\lib\jfr'#将os.walk在元素中提取的值,分别放到root(根目录),dirs(目录名),files(文件名)中。
- for root,
- dirs,
- files in os.walk(path) : print("files = ", files) print len(files)
非常简单的代码,这里我只对 files 文件名进行遍历打印 其他的用法大家看到这个语法就可以自己尝试了。
接下来进入正题 遍历文件解析 XML 文件 提取坐标集存入文档:
先看一部分简单版本的 XML 文件,目标就是将其中 X,Y 坐标提取存入文件 用途方便后来对数字图像处理的操作
- <readingSession>
- <annotationVersion>3.12</annotationVersion>
- <servicingRadiologistID>540461523</servicingRadiologistID>
- <unblindedReadNodule>
- <noduleID>Nodule 001</noduleID>
- <characteristics>
- <subtlety>5</subtlety>
- <internalStructure>1</internalStructure>
- <calcification>6</calcification>
- <sphericity>3</sphericity>
- <margin>3</margin>
- <lobulation>3</lobulation>
- <spiculation>4</spiculation>
- <texture>5</texture>
- <malignancy>5</malignancy>
- </characteristics>
- <roi>
- <imageZposition>-125.000000 </imageZposition>
- <imageSOP_UID>1.3.6.1.4.1.14519.5.2.1.6279.6001.110383487652933113465768208719</imageSOP_UID>
- <inclusion>TRUE</inclusion>
- <edgeMap>
- <xCoord>312</xCoord>
- <yCoord>355</yCoord>
- </edgeMap>
- <edgeMap>
- <xCoord>311</xCoord>
- <yCoord>356</yCoord>
- </edgeMap>
- <edgeMap>
- <xCoord>310</xCoord>
- <yCoord>357</yCoord>
- </edgeMap>
- <edgeMap>
- <xCoord>309</xCoord>
- <yCoord>357</yCoord>
- </edgeMap>
- <edgeMap>
- <xCoord>308</xCoord>
- <yCoord>358</yCoord>
- </edgeMap>
- </roi>
- <readingSession>
接下来看看 PYTHON 部分的代码:
- # -*- coding: UTF-8 -*-
- """
- Spyder Editor
- This is a temporary script file.
- """
- #from __future__ import divition
- import xml.dom.minidom
- import os
- path = 'C:\Program Files\Java\jre-9.0.1\lib\jfr'
- #遍历文件夹获取文件名返回数组
- for root, dirs, files in os.walk(path):
- print( "files = ", files)
- print len(files)
- #通过文件名数组,不断的打开XML文件提取坐标
- for f in range(len(files)):
- fpName = files[f]
- #获取XML文件的除了xml三个后缀之前的名字
- nn =str(fpName[0:3])
- #对每个XML文件都以相同的名字打开 W的方式 没有文件的话 会自动创建一个出来
- fp = open(nn+".txt","w")
- print nn
- print fpName
- #打开XML文档
- dom = xml.dom.minidom.parse(fpName)
- #得到文档元素对象
- root = dom.documentElement
- #获取标签集并提取坐标存入文档
- drLen= root.getElementsByTagName('readingSession').length
- if(drLen != 0):
- for s in range(drLen):
- drText ="\n\nDR"+str(s+1)+"\n\n"
- fp.write(drText)
- bb = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi').length
- for i in range(bb):
- roiX = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('xCoord')
- xLen = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('xCoord').length
- roiY = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('yCoord')
- yLen = root.getElementsByTagName('readingSession')[s].getElementsByTagName('roi')[i].getElementsByTagName('yCoord').length
- xText = "\n 第"+str(i+1)+"个roi的X坐标\n"
- fp.write(xText)
- #将X坐标全部存入
- roiData =""
- for j in range(xLen):
- roiData+= str(roiX[j].firstChild.data)+","
- fp.write(roiData)
- yText ="\n Y坐标\n"
- fp.write(yText)
- for k in range(yLen) :
- roiData += str(roiX[j].firstChild.data)+","
- fp.write(roiData)
- fp.close()
以上代码完成后就能形成一个这样的文件:
如果是遍历解析的话 大概就会形成这样的一堆文件:
- 大家好我是飞机,是一个想成为全栈工程师的男人。
- 我这辈子看过很多代码,都没有你好看。
- 希望以后能变成:
- 我这辈子写过很多代码,都没有你好看。
来源: https://www.cnblogs.com/DOMLX/p/8213442.html