求,百事汇通快递价格在哪

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 15, 距离下一级还需 185 积分
论坛徽章:0
问题描述:
&&我想利用logging的配置文件,添加一个新的handler,此handler的输出格式format是自定义的,如XMLLayout
[handlers]
keys = chainsaw
[formatters]
keys = xmllayout
[logger_root]
level = NOTSET
handlers = chainsaw
[handler_chainsaw]
class = xmllayout.RawSocketHandler
args = ('localhost', 444
level = NOTSET
formatter = xmllayout
[formatter_xmllayout]
class = xmllayout.XMLLayout
利用此输出,发送log信息到chainsaw(一个可视性比较好的log viewer)
python提示:
g.py&, line 10, in &module&
&&logging.config.fileConfig('log.conf')
&&File &E:\Python25\lib\logging\config.py&, line 84, in fileConfig
&&handlers = _install_handlers(cp, formatters)
&&File &E:\Python25\lib\logging\config.py&, line 149, in _install_handlers
&&klass = eval(klass, vars(logging))
&&File &&string&&, line 1, in &module&
NameError: name 'xmllayout' is not defined
个人猜想:
因为我直接在py脚本中
import xmllayout
handler = xmllayout.RawSocketHandler('localhost', 444
handler.setFormatter(xmllayout.XMLLayout())
logging.root.addHandler(handler)
是正常的,所以认为,应该是配置文件的命名空间没有xmllayout,故python报错。
但怎样让这个配置文件的命名空间能找到xmllayout呢?还请哪位知道的告知,在线等答案,给分!!!
(ps:我直接在文件&E:\Python25\lib\logging\config.py&中import xmllayout不行, xmllayout模块已正确安装,py脚本中引用没有问题)
, , , , , , , , ,
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 15, 距离下一级还需 185 积分
论坛徽章:0
自己顶一下
小富即安, 积分 3530, 距离下一级还需 1470 积分
论坛徽章:0
本帖最后由
23:17 编辑
没有完全看明白你想表达的意思。
不过推测是有一个模块名写在配置文件里,现在你想导入 可以这样 mod =__import__('xmllaylout')。
白手起家, 积分 15, 距离下一级还需 185 积分
论坛徽章:0
回复&&mars6505
没有完全看明白你想表达的意思。
不过推测是有一个模块名写在配置文件里,现在你想导入&&...
<font color="#6033177 发表于
& & 首先,非常感谢您的回复!!!
再感谢您的推测跟我的问题一致!
我在配置文件里按你所说, 添加了
xmllayout = __import__('xmllaylout')
但还是报错:
1。 直接在配置文件添加, 不在[Section_name]下:
g.py&, line 10, in &module&
& & logging.config.fileConfig('log.conf')
&&File &E:\Python25\lib\logging\config.py&, line 74, in fileConfig
& & cp.read(fname)
&&File &E:\Python25\lib\ConfigParser.py&, line 267, in read
& & self._read(fp, filename)
&&File &E:\Python25\lib\ConfigParser.py&, line 462, in _read
& & raise MissingSectionHeaderError(fpname, lineno, line)
ConfigParser.MissingSectionHeaderError: File contains no section headers.
file: log.conf, line: 1
&xmllayout = __import__('xmllaylout')\n&
2。直接在配置文件添加,在[Section_name]下:
g.py&, line 10, in &module&
& & logging.config.fileConfig('log.conf')
&&File &E:\Python25\lib\logging\config.py&, line 84, in fileConfig
& & handlers = _install_handlers(cp, formatters)
&&File &E:\Python25\lib\logging\config.py&, line 149, in _install_handlers
& & klass = eval(klass, vars(logging))
&&File &&string&&, line 1, in &module&
NameError: name 'xmllayout' is not defined
错误依旧,不过还是非常感谢您的帮助。 可能直接在配置文件添加 xmllayout = __import__('xmllaylout') 是不行的,添到.py文件才起作用?
小富即安, 积分 3530, 距离下一级还需 1470 积分
论坛徽章:0
不是让你写在配置文件里,是在你自己的脚本里用__import__()导入配置文件指定模块。
白手起家, 积分 15, 距离下一级还需 185 积分
论坛徽章:0
& & 谢谢,不过在.py代码里加入xmllayout = __import__('xmllayout') 或 mod = __import__('xmllayout') 也还是不行
我之前有试过代码中直接 import xmllayout ,再调用解析配置文件,也是不得行。
小富即安, 积分 3530, 距离下一级还需 1470 积分
论坛徽章:0
给个代码看看吧。
白手起家, 积分 15, 距离下一级还需 185 积分
论坛徽章:0
& & test_logging.pyimport logging
import logging.config
import xmllayout
logging.config.fileConfig('log.conf')
logging.error('this is error')
<('this is info')复制代码log.conf[loggers]
keys = root
[handlers]
keys = chainsaw
[formatters]
keys = xmllayout
[logger_root]
level = NOTSET
handlers = chainsaw
[handler_chainsaw]
class = xmllayout.RawSocketHandler
args = ('localhost', 4448)
level = NOTSET
formatter = xmllayout
[formatter_xmllayout]
class = xmllayout.XMLLayout
复制代码
小富即安, 积分 3530, 距离下一级还需 1470 积分
论坛徽章:0
XMLLayout模块你装了没有?
白手起家, 积分 15, 距离下一级还需 185 积分
论坛徽章:0
& & 装了的,直接在代码里配置(不使用配置文件)是可行的。import logging
import logging.config
import xmllayout
handler =xmllayout.RawSocketHandler('localhost', 4448)
handler.setFormatter(xmllayout.XMLLayout())
logging.root.addHandler(handler)
logging.getLogger().setLevel(logging.DEBUG)
logging.root.addHandler(logging.StreamHandler())
##logging.config.fileConfig('log.conf')
logging.error('this is error')
<('this is info')复制代码
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处本帖子已过去太久远了,不再提供回复功能。python自定义解析简单xml格式文件的方法
作者:像风一样的自由
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了python自定义解析简单xml格式文件的方法,涉及Python解析XML文件的相关技巧,非常具有实用价值,需要的朋友可以参考下
本文实例讲述了python自定义解析简单xml格式文件的方法。分享给大家供大家参考。具体分析如下:
因为公司内部的接口返回的字串支持2种形式:php数组,xml;结果php数组python不能直接用,而xml字符串的格式不是标准的,所以也不能用标准模块解析。【不标准的地方是某些节点会的名称是以数字开头的】,所以写个简单的脚步来解析一下文件,用来做接口测试。
#!/usr/bin/env python
#encoding: utf-8
class xmlparse:
def __init__(self, xmlstr):
self.xmlstr = xmlstr
self.xmldom = self.__convet2utf8()
self.xmlnodelist = []
self.xpath = ''
def __convet2utf8(self):
headstr = self.__get_head()
xmldomstr = self.xmlstr.replace(headstr, '')
if 'gbk' in headstr:
xmldomstr = xmldomstr.decode('gbk').encode('utf-8')
elif 'gb2312' in headstr:
xmldomstr = self.xmlstr.decode('gb2312').encode('utf-8')
return xmldomstr
def __get_head(self):
headpat = r'&\&#63;xml.*\&#63;&'
headpatobj = re.compile(headpat)
headregobj = headpatobj.match(self.xmlstr)
if headregobj:
headstr = headregobj.group()
return headstr
def parse(self, xpath):
self.xpath = xpath
xpatlist = []
xpatharr = self.xpath.split('/')
for xnode in xpatharr:
spcindex = xnode.find('[')
if spcindex & -1:
index = int(xnode[spcindex+1:-1])
xnode = xnode[:spcindex]
index = 0;
temppat = ('&%s&(.*&#63;)&/%s&' % (xnode, xnode),index)
xpatlist.append(temppat)
xmlnodestr = self.xmldom
for xpat,index in xpatlist:
xmlnodelist = re.findall(xpat,xmlnodestr)
xmlnodestr = xmlnodelist[index]
if xmlnodestr.startswith(r'&![CDATA['):
xmlnodestr = xmlnodestr.replace(r'&![CDATA[','')[:-3]
self.xmlnodelist = xmlnodelist
return xmlnodestr
if '__main__' == __name__:
xmlstr = '&&#63;xml version="1.0" encoding="utf-8" standalone="yes" &#63;&&resultObject&&a&&product_id&aaaaa&/product_id&&product_name&&![CDATA[bbbbb]]&&/a&&b&&product_id&bbbbb&/product_id&&product_name&&![CDATA[bbbbb]]&&/b&&/product_name&&/resultObject&'
xpath1 = '/product_id'
xpath2 = '/product_id[1]'
xpath3 = '/a/product_id'
xp = xmlparse(xmlstr)
print 'xmlstr:',xp.xmlstr
print 'xmldom:',xp.xmldom
print '------------------------------'
getstr = xp.parse(xpath1)
print 'xpath:',xp.xpath
print 'get list:',xp.xmlnodelist
print 'get string:', getstr
print '------------------------------'
getstr = xp.parse(xpath2)
print 'xpath:',xp.xpath
print 'get list:',xp.xmlnodelist
print 'get string:', getstr
print '------------------------------'
getstr = xp.parse(xpath3)
print 'xpath:',xp.xpath
print 'get list:',xp.xmlnodelist
print 'get string:', getstr
运行结果:
xmlstr: &&#63;xml version="1.0" encoding="utf-8" standalone="yes" &#63;&&resultObject&&a&&product_id&aaaaa&/product_id&&product_name&&![CDATA[bbbbb]]&&/a&&b&&product_id&bbbbb&/product_id&&product_name&&![CDATA[bbbbb]]&&/b&&/product_name&&/resultObject&
xmldom: &resultObject&&a&&product_id&aaaaa&/product_id&&product_name&&![CDATA[bbbbb]]&&/a&&b&&product_id&bbbbb&/product_id&&product_name&&![CDATA[bbbbb]]&&/b&&/product_name&&/resultObject&
------------------------------
xpath: /product_id
get list: ['aaaaa', 'bbbbb']
get string: aaaaa
------------------------------
xpath: /product_id[1]
get list: ['aaaaa', 'bbbbb']
get string: bbbbb
------------------------------
xpath: /a/product_id
get list: ['aaaaa']
get string: aaaaa
因为返回的xml格式比较简单,没有带属性的节点,所以处理起来就比较简单了。但测试还是发现有一个bug。即当相同节点嵌套时会出现正则匹配出问题,该问题的可以通过避免在xpath中出现有嵌套节点的名称来解决,否则只有重写复杂的机制了。
希望本文所述对大家的Python程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Python中将字典转换为XML以及相关的命名空间解析_python_ThinkSAAS
Python中将字典转换为XML以及相关的命名空间解析
Python中将字典转换为XML以及相关的命名空间解析
内容来源: 网络
尽管 xml.etree.ElementTree 库通常用来做解析工作,其实它也可以创建XML文档。 例如,考虑如下这个函数:&#13;
from xml.etree.ElementTree import Element&#13;
def dict_to_xml(tag, d):&#13;
Turn a simple dict of key/value pairs into XML&#13;
elem = Element(tag)&#13;
for key, val in d.items():&#13;
child = Element(key)&#13;
child.text = str(val)&#13;
elem.append(child)&#13;
return elem&#13;
下面是一个使用例子:&#13;
&&& s = { &name&: &GOOG&, &shares&: 100, &price&:490.1 }&#13;
&&& e = dict_to_xml(&stock&, s)&#13;
&&& e&#13;
&Element &stock& at 0x&&#13;
转换结果是一个 Element 实例。对于I/O操作,使用 xml.etree.ElementTree 中的 tostring() 函数很容易就能将它转换成一个字节字符串。例如:&#13;
&&& from xml.etree.ElementTree import tostring&#13;
&&& tostring(e)&#13;
b&&stock&&price&490.1&/price&&shares&100&/shares&&name&GOOG&/name&&/stock&&&#13;
如果你想给某个元素添加属性值,可以使用 set() 方法:&#13;
&&& e.set(&_id&,&1234&)&#13;
&&& tostring(e)&#13;
b&&stock _id="1234"&&price&490.1&/price&&shares&100&/shares&&name&GOOG&/name&&#13;
&/stock&&&#13;
如果你还想保持元素的顺序,可以考虑构造一个 OrderedDict 来代替一个普通的字典。当创建XML的时候,你被限制只能构造字符串类型的值。例如:&#13;
def dict_to_xml_str(tag, d):&#13;
Turn a simple dict of key/value pairs into XML&#13;
parts = [&&{}&&.format(tag)]&#13;
for key, val in d.items():&#13;
parts.append(&&{0}&{1}&/{0}&&.format(key,val))&#13;
parts.append(&&/{}&&.format(tag))&#13;
return &&.join(parts)&#13;
问题是如果你手动的去构造的时候可能会碰到一些麻烦。例如,当字典的值中包含一些特殊字符的时候会怎样呢?&#13;
&&& d = { &name& : &&spam&& }&#13;
&&& # String creation&#13;
&&& dict_to_xml_str(&item&,d)&#13;
&&item&&name&&spam&&/name&&/item&&&#13;
&&& # Proper XML creation&#13;
&&& e = dict_to_xml(&item&,d)&#13;
&&& tostring(e)&#13;
b&&item&&name&&spam&&/name&&/item&&&#13;
注意到程序的后面那个例子中,字符 ‘&& 和 ‘&& 被替换成了 & 和 &&#13;
下面仅供参考,如果你需要手动去转换这些字符, 可以使用 xml.sax.saxutils 中的 escape() 和 unescape() 函数。例如:&#13;
&&& from xml.sax.saxutils import escape, unescape&#13;
&&& escape(&&spam&&)&#13;
&&spam&&&#13;
&&& unescape(_)&#13;
&&spam&&&#13;
除了能创建正确的输出外,还有另外一个原因推荐你创建 Element 实例而不是字符串, 那就是使用字符串组合构造一个更大的文档并不是那么容易。 而 Element 实例可以不用考虑解析XML文本的情况下通过多种方式被处理。 也就是说,你可以在一个高级数据结构上完成你所有的操作,并在最后以字符串的形式将其输出。&#13;
利用命名空间解析XML文档&#13;
如果你解析这个文档并执行普通的查询,你会发现这个并不是那么容易,因为所有步骤都变得相当的繁琐。&#13;
&&& # Some queries that work&#13;
&&& doc.findtext(&author&)&#13;
&David Beazley&&#13;
&&& doc.find(&content&)&#13;
&Element &content& at 0x&&#13;
&&& # A query involving a namespace (doesn&t work)&#13;
&&& doc.find(&content/html&)&#13;
&&& # Works if fully qualified&#13;
&&& doc.find(&content/{http://www.w3.org/1999/xhtml}html&)&#13;
&Element &{http://www.w3.org/1999/xhtml}html& at 0x&&#13;
&&& # Doesn&t work&#13;
&&& doc.findtext(&content/{http://www.w3.org/1999/xhtml}html/head/title&)&#13;
&&& # Fully qualified&#13;
&&& doc.findtext(&content/{http://www.w3.org/1999/xhtml}html/&&#13;
... &{http://www.w3.org/1999/xhtml}head/{http://www.w3.org/1999/xhtml}title&)&#13;
&Hello World&&#13;
你可以通过将命名空间处理逻辑包装为一个工具类来简化这个过程:&#13;
class XMLNamespaces:&#13;
def __init__(self, **kwargs):&#13;
self.namespaces = {}&#13;
for name, uri in kwargs.items():&#13;
self.register(name, uri)&#13;
def register(self, name, uri):&#13;
self.namespaces[name] = &{&+uri+&}&&#13;
def __call__(self, path):&#13;
return path.format_map(self.namespaces)&#13;
通过下面的方式使用这个类:&#13;
&&& ns = XMLNamespaces(html=&http://www.w3.org/1999/xhtml&)&#13;
&&& doc.find(ns(&content/{html}html&))&#13;
&Element &{http://www.w3.org/1999/xhtml}html& at 0x&&#13;
&&& doc.findtext(ns(&content/{html}html/{html}head/{html}title&))&#13;
&Hello World&&#13;
解析含有命名空间的XML文档会比较繁琐。 上面的 XMLNamespaces 仅仅是允许你使用缩略名代替完整的URI将其变得稍微简洁一点。&#13;
很不幸的是,在基本的 ElementTree 解析中没有任何途径获取命名空间的信息。 但是,如果你使用 iterparse() 函数的话就可以获取更多关于命名空间处理范围的信息。例如:&#13;
&&& from xml.etree.ElementTree import iterparse&#13;
&&& for evt, elem in iterparse(&ns2.xml&, (&end&, &start-ns&, &end-ns&)):&#13;
... print(evt, elem)&#13;
end &Element &author& at 0x10110de10&&#13;
start-ns (&&, &http://www.w3.org/1999/xhtml&)&#13;
end &Element &{http://www.w3.org/1999/xhtml}title& at 0x&&#13;
end &Element &{http://www.w3.org/1999/xhtml}head& at 0x&&#13;
end &Element &{http://www.w3.org/1999/xhtml}h1& at 0x&&#13;
end &Element &{http://www.w3.org/1999/xhtml}body& at 0x&&#13;
end &Element &{http://www.w3.org/1999/xhtml}html& at 0x10110df70&&#13;
end-ns None&#13;
end &Element &content& at 0x10110de68&&#13;
end &Element &top& at 0x10110dd60&&#13;
&&& elem # This is the topmost element&#13;
&Element &top& at 0x10110dd60&&#13;
最后一点,如果你要处理的XML文本除了要使用到其他高级XML特性外,还要使用到命名空间, 建议你最好是使用 lxml 函数库来代替 ElementTree 。 例如,lxml 对利用DTD验证文档、更好的XPath支持和一些其他高级XML特性等都提供了更好的支持。 这一小节其实只是教你如何让XML解析稍微简单一点。&#13;
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信php解析带有命名空间的xml_PHP教程_ThinkSAAS
php解析带有命名空间的xml
php解析带有命名空间的xml
内容来源: 网络
xml如果带有命名空间我们将如何解析,例如:
&ns1:CreateBillResponse xmlns:ns1="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&&ns1:out&&ns1:OutVo&&ns1:strB2BCode xmlns=""&AM5938443&/ns1:strB2BCode&&ns1:strFlag xmlns=""&0&/ns1:strFlag&&ns1:strHpCode xsi:nil="true" xmlns=""/&&ns1:strReason xmlns="
"&,产品编码为空,售达方编码为空&/ns1:strReason&&/ns1:OutVo&&/ns1:out&&/ns1:CreateBillResponse&
解析的方法:
function parseNamespaceXml($xmlstr)
$xmlstr = preg_replace(&/sxmlns="(.*?)"/&, & _xmlns="${1}"&, $xmlstr);
$xmlstr = preg_replace(&/&(/)?(w+):(w+)/&, &&${1}${2}_${3}&, $xmlstr);
$xmlstr = preg_replace(&/(w+):(w+)="(.*?)"/&, &${1}_${2}="${3}"&, $xmlstr);
$xmlobj = simplexml_load_string($xmlstr);
return json_decode(json_encode($xmlobj), true);
}内容来源:
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信

我要回帖

更多关于 百事汇通快递电话号码 的文章

 

随机推荐