【问题标题】:Split string in xml在xml中拆分字符串
【发布时间】:2018-04-09 08:16:15
【问题描述】:

我有一个包含数据的 xml 文件。

<STOKUNIT>
  <BELGETARIGI>2017-09-20</BELGETARIGI>
  <STOKKODU>1KKUPS0098</STOKKODU>
  <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
  <RENK>139</RENK>
  <BEDEN>.</BEDEN>
  <STOKBARKODU>8680044399128</STOKBARKODU>
  <FATURANO>6-R-7-4825</FATURANO>
  <MAGAZAKODU>MGUR-02</MAGAZAKODU>
  <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
  <MIKTAR>1.00</MIKTAR>
  <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
  <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
  <KDVTUTAT>4.71</KDVTUTAT>
  <FIYAT>30.89</FIYAT>
  <TUTAR>30.89</TUTAR>
  <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
  <BIRIMFIYAT>30.89</BIRIMFIYAT>
  <NETTUTAR>30.89</NETTUTAR>
  <ODEMETIPI> Nakit</ODEMETIPI>
  <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>

我想只拆分FATURANO这样的

6-R-7

4825

而且这个“4825”应该有不同的名字。

<STOKUNIT>
          <BELGETARIGI>2017-09-20</BELGETARIGI>
          <STOKKODU>1KKUPS0098</STOKKODU>
          <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
          <RENK>139</RENK>
          <BEDEN>.</BEDEN>
          <STOKBARKODU>8680044399128</STOKBARKODU>
          <FATURANO>6-R-7</FATURANO>
          ***<NEWONE>4825</NEWONE>***
          <MAGAZAKODU>MGUR-02</MAGAZAKODU>
          <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
          <MIKTAR>1.00</MIKTAR>
          <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
          <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
          <KDVTUTAT>4.71</KDVTUTAT>
          <FIYAT>30.89</FIYAT>
          <TUTAR>30.89</TUTAR>
          <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
          <BIRIMFIYAT>30.89</BIRIMFIYAT>
          <NETTUTAR>30.89</NETTUTAR>
          <ODEMETIPI> Nakit</ODEMETIPI>
          <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>

我需要像这样转换 xml 数据,但如果你只回答我第一个问题如何正确拆分字符串,我会做其他传输

【问题讨论】:

  • 欢迎堆栈溢出,请在代码标签中清楚地添加预期输出,然后让我们知道。
  • 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • 不要使用 awk/sed 解析 xml。总有一天你会明白为什么

标签: xml linux awk sed xmlstarlet


【解决方案1】:

由于awk标签是由OP添加的,所以试图在其中回答。

awk -v s1="  " -F"[><]" '
/FATURANO/{
  match($3,/.*-/);
  val1=substr($3,RSTART,RLENGTH-1);
  val2=substr($3,RLENGTH+1);
  print $0 RS s1 "<test>" val1 "</" val1 ">" RS s1 "<test>" val2 "</" val2 ">";
  next
}
1
'   Input_file

【讨论】:

【解决方案2】:

使用 xmlstarlet 和 bash 的 Parameter Expansion:

string=$(xmlstarlet select --template --value-of '//STOKUNIT/FATURANO' file.xml)
part1="${string%-*}"
part2="${string##*-}"
xmlstarlet edit --omit-decl --update '//STOKUNIT/FATURANO' --value "$part1" --append '//STOKUNIT/FATURANO' --type elem -n NEWONE --value "$part2" file.xml

如果您想就地编辑 file.xml,请将选项 -L 添加到最后一个 xmlstarlet 命令。

输出:

<STOKUNIT>
  <BELGETARIGI>2017-09-20</BELGETARIGI>
  <STOKKODU>1KKUPS0098</STOKKODU>
  <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
  <RENK>139</RENK>
  <BEDEN>.</BEDEN>
  <STOKBARKODU>8680044399128</STOKBARKODU>
  <FATURANO>6-R-7</FATURANO>
  <NEWONE>4825</NEWONE>
  <MAGAZAKODU>MGUR-02</MAGAZAKODU>
  <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
  <MIKTAR>1.00</MIKTAR>
  <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
  <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
  <KDVTUTAT>4.71</KDVTUTAT>
  <FIYAT>30.89</FIYAT>
  <TUTAR>30.89</TUTAR>
  <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
  <BIRIMFIYAT>30.89</BIRIMFIYAT>
  <NETTUTAR>30.89</NETTUTAR>
  <ODEMETIPI> Nakit</ODEMETIPI>
  <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>

请参阅:xmlstarlet select --helpxmlstarlet edit --help

【讨论】:

  • 我的意思是这个输出是一样的,但如果有更多的节点它不正确。
  • 很遗憾,您的示例不具有代表性。
【解决方案3】:

使用单个 xmlstarlet 表达式:

xmlstarlet ed -u '//STOKUNIT/FATURANO' -x "substring(., 0,string-length(.)-4)" \
-a '//STOKUNIT/FATURANO' -t elem -n NEWONE \
-v "$(xmlstarlet sel -t -v 'substring(//STOKUNIT/FATURANO, string-length(//STOKUNIT/FATURANO)-3)' file.xml)" file.xml 
  • ed - 编辑模式

  • -x - xpath 表达式

  • -a - 追加元素

  • -t - 附加元素的type(在edit模式下)

  • -n - 附加元素的名称

  • -v - 更新/附加元素的值


输出:

<?xml version="1.0"?>
<STOKUNIT>
  <BELGETARIGI>2017-09-20</BELGETARIGI>
  <STOKKODU>1KKUPS0098</STOKKODU>
  <STOKADI>New Bone China 3-Lu Kupa Seti</STOKADI>
  <RENK>139</RENK>
  <BEDEN>.</BEDEN>
  <STOKBARKODU>8680044399128</STOKBARKODU>
  <FATURANO>6-R-7</FATURANO>
  <NEWONE>4825</NEWONE>
  <MAGAZAKODU>MGUR-02</MAGAZAKODU>
  <MAGAZAADI>GURCISTAN TIFLIS DIGOMI CAD. MAGAZA</MAGAZAADI>
  <MIKTAR>1.00</MIKTAR>
  <SATISSORUMLUSUKODU>99055</SATISSORUMLUSUKODU>
  <SATISSORUMLUSUADI>MARIAM SULIAVRI</SATISSORUMLUSUADI>
  <KDVTUTAT>4.71</KDVTUTAT>
  <FIYAT>30.89</FIYAT>
  <TUTAR>30.89</TUTAR>
  <INDIRIMTUTAR>0.00</INDIRIMTUTAR>
  <BIRIMFIYAT>30.89</BIRIMFIYAT>
  <NETTUTAR>30.89</NETTUTAR>
  <ODEMETIPI> Nakit</ODEMETIPI>
  <ODEMEACIKLAMASI> Nakit</ODEMEACIKLAMASI>
</STOKUNIT>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2017-02-03
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多