- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在 python 中使用 LXML 库进行 XML 解析。
在 XML 文件中,我有一些错误字符导致 python 出现以下错误:
lxml.etree.XMLSyntaxError: CharRef
在用 python 打开和获取 XML 文件的内容之前,我必须从两个标签中删除坏字符:
1:<essid cloaked="true">....</essid>
或 <essid cloaked="false">....</essid>
.
2:<client-manuf>....</client-manuf>
XML 文件的大小很大。所以我想用 sed 或 awk 或类似的工具来完成。
<crypt>0</crypt>
<total>20 50</total>
<fragments>0</fragments>
<retries>0</retries>
</packets>
<datasize>0</datasize>
<wireless-client number="1" type="established" first-time="Thu Feb 15 16:45:43 2018" last-time="Thu Feb 15 16:45:43 2018">
<client-mac>08:EA:40:D0:55:43</client-mac>
<client-manuf>SHENZHEN BILIAN ELECTRONIC CO.&#x ef;&#x bc;&#x 8c;LTD</client-manuf>
<essid cloaked="true">&#x 0;&#x 0;&#x 0;&#x 0;&#x 0;</essid>
<channel>8</channel>
<maxseenrate>1.000000</maxseenrate>
<carrier>IEEE 802.11b+</carrier>
<encoding>CCK</encoding>
<packets>
<LLC>0</LLC>
<data>0</data>
<crypt>0</crypt>
我想从这些标签(client-manuf 和 essid)中删除坏字符。
发件人:<client-manuf>SHENZHEN BILIAN ELECTRONIC CO.&#x ef;&#x bc;&#x 8c;LTD</client-manuf>
至(或此):<client-manuf>SHENZHEN BILIAN ELECTRONIC CO. LTD</client-manuf>
至(或此):<client-manuf>SHENZHEN BILIAN ELECTRONIC CO</client-manuf>
发件人:<essid cloaked="true">&#x 0;&#x 0;&#x 0;&#x 0;&#x 0;</essid>
发件人:<essid cloaked="false">&#x 0;&#x WiFi 0;&#x MTN 0;&#x 0;&#x 0;</essid>
至(或此):<essid cloaked="true"></essid>
至(或此):<essid cloaked="true">N/A SSID</essid>
至(或此):<essid cloaked="false">WiFi MTN</essid>
for example, two bad chars:
1: 0;
2: &#x
这是我的解决方案。但它不能很好地满足我的需求:
sed -e '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/ s/\(&#x\|0;\)//g' a.txt
最佳答案
您的 sed 命令看起来并没有那么糟糕,它只是留下了很多空白。
由于 sed 通常是贪婪的,您可以用“*”指定任意数量的空间。
cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/ s/ *\(&#x\|0;\) *//g'
另一方面,如果有一些有效的文本,您可能不想将它们粘在一起,因此您可以为每个删除的模式添加一个空格:
cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/ s/ *\(&#x\|0;\) */ /g'
最后,您可能会将多个空格压缩为一个:
cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/{s/ *\(&#x\|0;\) */ /g;s/ */ /g}'
请注意,构造 {foo;bar} 将两个命令绑定(bind)到一个命令 block ,仅在之前抓取的模式上运行。第二种模式会影响整个文件。
用另一对带掩码的括号和带掩码的加号:
cat bad.xml | sed '/<essid cloaked="\(true\|false"\)>*.*<\/essid>/{s/\( *\(&#x\|0;\) *\)\+/ missing essid /g;s/ */ /g}'
你可以 s:substitution 重复出现的模式只用一件事。
s/\( *\(&#x\|0;\) *\)\+/ missing essid /;
^ ( (pattern1) )+ / replacement /(g now obsolete
(pattern .......2)
内部模式是替代的 &#x 或 0;。外部模式是内部模式,可选地由空白保护,如
"0;"
"0; "
" 0; "
" 0;"
" 0; "
" &#x"
等等。
你想要内部模式,我们称它为 X,重复一次或多次,因此 +。但是如果没有括号,+ 只会处理最后一个字符,而不是整个模式。
您必须学习这种正则表达式语言。找一个教程。你不能要求你生活中需要的每一种可能的变化。
拥有良好的基本理解会很快带来返回。你不需要知道一切,但基本的东西应该有一个很好的估计,什么是可能的,什么不是。然后一个repo,去搜索那些很少用到的东西。然后您可能只会问困难/复杂的问题。
关于python - 如何删除或替换两个 xml 标记之间的特定字符 [linux、python、lxml、sed、awk、...]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48826469/
我想对一个字符串执行搜索和替换,比如 password。 正如您从问题中了解到的那样,替换后的字符串应变为 sdvvzrug。 但不幸的是,下面的代码输出bbbbcaab: $search = ran
我正在使用 futurize --stage2它应用了许多源代码转换以使代码 python2 和 python3 兼容。其中一个修复是所有分区 a/b 都替换为 old_div(a/b),我想避免这种
我正在使用 RStudio,但我在控制台上的输出被截断了。我找不到如何停止截断(我尝试搜索 ?options 以及在谷歌上搜索的时间比我想承认的要长)。 编辑:我向大家道歉!我最初的长名称为“This
我有一个 fragment 堆栈,我在其中使用替换和相加。添加或替换我的 fragment 的代码(在我的 Activity 中)如下 private fun addFragment(fragment
我在一个数组中插入了一些字符串,但在我这样做之前,我想按照主题所说的去做。只用 %20 替换空格,我这样做: Name.push(linkText.replace(" ", "%20")); 但是我如
我正在尝试编译和测试我在网上看到的代码 Expanding an IP add 。但是,当我尝试编译它时,我收到有关 StringBuilder 替换方法的错误。它说: IPadd.java:52:
我正在尝试使用 dplyr 的最新功能重写我的部分代码,方法是将 data.frame() 替换为 data_frame() 和 cbind() 与 bind_cols(): library(rgeo
我最近偶然发现了 replace()和 "[ x.tst s.tst s.tst [,1] [,2] [,3] [1,] 0 0 0
我一直想知道,如何在给定的参数内进行替换。 如果你有这样的一行: 123,Hello,World,(I am, here), unknown 你想更换 World与 Foobar那么这是一个简单的任务
如何转义字符串中的双引号?例如, input: "Nobody" output: \"Nobody\" 我尝试过这样的操作,但不起作用: String name = "Nobody"; name.r
我正在做类似的事情: SQL sql sQl SqL var ps = document.getElementsByTagName('p'); for(var i = 0; i 但它不会替换文本。
我正在尝试用 \" 替换所有 " 并用 JSON 解析字符串,但浏览器抛出错误 SyntaxError: JSON Parse error: Unrecognized token '\'. 下面是代码
大家好,在这里挣扎...... 是否可以将第一个正斜杠之间的任何内容替换为“”,但保留其余部分? 例如var 将是 string "/anything-here-this-needs-to-be-re
在下面的代码中,JavaScript 替换函数中的 alert(a) 将提醒匹配的字符串,在本例中,将是 {name} 和 {place}。 这按照文档 javascript docs 的描述工作,即
+-----------------------------+ | tables | +-------------------
我正在尝试用\"替换包含 "的字符串,下面是我尝试过的程序 String s="\"/test /string\""; s = s.replaceAll("\"", "\\\"");
var text = "a's ..a's ...\"... "; text = convert(text); function convert( text ) { var n = text
我正在尝试使用 JavaScript 中的替换函数,但有一个问题。 strNewDdlVolCannRegion = strNewDdlVolCannRegion.replace(/_existing
好吧,首先我对我的上一篇文章感到非常抱歉,但我真的需要帮助,我会把我真正想要的东西放在一个更清晰的代码中。我不擅长 javascript,所以希望你能帮助我。
我正在写一张纸条,遇到了障碍。可能有更有效的方法来执行此操作,但我对 Python 还很陌生。我正在尝试创建用户生成的 IP 地址列表。我正在使用 print 来查看生成的值是否正确。当我运行此代码时
我是一名优秀的程序员,十分优秀!