如何使用shell脚本读取XML并写入文本文件?
如何在Shell脚本中读取XML标记及其值? 我搜索发现只有当我们知道标签名时才有可能 但是,我需要一个脚本,它读取XML中的所有标记(重复标记),其中包含值。 在我的XML中,标记可能会更改。所以,我想要一个可以用于不同XML的脚本如何使用shell脚本读取XML并写入文本文件?,xml,bash,shell,Xml,Bash,Shell,如何在Shell脚本中读取XML标记及其值? 我搜索发现只有当我们知道标签名时才有可能 但是,我需要一个脚本,它读取XML中的所有标记(重复标记),其中包含值。 在我的XML中,标记可能会更改。所以,我想要一个可以用于不同XML的脚本 <Data> <Employees> <Employee location = "Paris"> <Name> Andy </Name>
<Data>
<Employees>
<Employee location = "Paris">
<Name> Andy </Name>
<ID> 101 </ID>
</Employee>
<Employee location = "Germany">
<Name> Batman </Name>
<ID> 202 </ID>
</Employee>
</Employees>
</Data>
尝试以下内容,并让我知道这是否有助于你
awk '
/<\/Data>/{
a="";
next
}
/<Data>/{
a=1;
next
}
/location/ && a{
gsub(/\"|>/,"",$NF);
location=$NF;
next
}
/Name/ && a{
name=$2;
next
}
/ID/ && a{
print "Name : ",name RS "ID: ",$2 RS "Location: ",location;
next
}
' Input_file
awk'
//{
a=“”;
下一个
}
//{
a=1;
下一个
}
/位置/&a{
gsub(/\“\”>/,“,$NF);
地点=$NF;
下一个
}
/名称/&a{
姓名=$2;
下一个
}
/ID/&a{
打印“姓名:”,姓名RS“ID:”,$2 RS“位置:”,位置;
下一个
}
'输入文件
根据OP的要求,不应该硬编码任何标签,所以现在也添加以下解决方案
EDIT2:我不是xml专家,但在这里尝试过,请您检查一下
awk 'NF==1 && (/ +<[a-zA-Z]+>/ || /^<[a-zA-Z]+>/ || / +<\/[a-zA-Z]+>/){
next
}
{
sub(/^ +/,"")
gsub(/\"|<|>/,"",$0);
sub(/\/.*/,"");
if($0){
print
}
}
' Input_file
awk'NF==1&&(/+/| |/^/|/+/){
下一个
}
{
子(/^+/,“”)
gsub(/\“/,”,$0);
子(/\/.*/,“”);
如果有的话(0美元){
打印
}
}
'输入文件
awk-F[\>\正如我在评论中所说的,shell不适用于除最琐碎的XML文件以外的所有XML文件。不过,以下Python脚本将处理您抛出的任何格式良好的XML:
import xml.parsers.expat
import sys
def start_element(name, attrs):
print('Start element:', name)
for attribute_name, attribute_value in attrs.items():
print('Attribute:', attribute_name, attribute_value)
def end_element(name):
print('End element:', name)
def char_data(data):
data = str(data).strip()
if data:
print('Character data:', data)
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
with open(sys.argv[1], 'rb') as xmlfile:
p.ParseFile(xmlfile)
它几乎是逐字复制自。您可以操作三个函数start\u元素
、end\u元素
和char\u数据
,以满足您的需要。(也就是说,到目前为止,它们不会产生您指定的确切输出,但可以稍加调整即可。)
可以这样称呼:
python3 script_above.py your_xml_file.xml
这不是shell脚本的工作。您应该使用适当的XML处理器,例如XSLT样式表。XML文件不能保证使用特定的空白格式或文本编码(这并不是说,您不能使用Bash在已知的XML文件上执行特定的小任务,但肯定不能在未知的XML文件上执行任意任务)感谢您的回复Boldewyn。我想知道是否有类似xmllint或其他可用的解析器?如果是,我希望脚本读取所有带值的标记。感谢您的回答RavinderSingh。但是,实际上我不知道标记名。有没有办法在不提供硬编码标记名的情况下读取所有标记?甚至没有ID,您将拥有的名称?No、 我的XML包含1000个标记。因此我无法给出所有的标记名。@CharanTej:你能现在查看我的EDIT2并告诉我吗?宾果,很高兴它帮助了你。享受学习和分享知识:)太好了!处理XML的聪明方法。谢谢
import xml.parsers.expat
import sys
def start_element(name, attrs):
print('Start element:', name)
for attribute_name, attribute_value in attrs.items():
print('Attribute:', attribute_name, attribute_value)
def end_element(name):
print('End element:', name)
def char_data(data):
data = str(data).strip()
if data:
print('Character data:', data)
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_element
p.EndElementHandler = end_element
p.CharacterDataHandler = char_data
with open(sys.argv[1], 'rb') as xmlfile:
p.ParseFile(xmlfile)
python3 script_above.py your_xml_file.xml