Wolfram mathematica Mathematica:将矩阵数据写入XML;从XML读取矩阵数据

Wolfram mathematica Mathematica:将矩阵数据写入XML;从XML读取矩阵数据,wolfram-mathematica,Wolfram Mathematica,(部分)我使用的对象的矩阵表示如下: { {1, A,{100, 20, 30},10}, {2, B,{100}, 0}, {3, X,{120,20},0}, {4, C,{},11} } 我希望以XML格式在外部存储此数据,如下所示 1002030 100 12020 我正在寻找一个关于如何: -将矩阵转换为XML(Mathematica命令哪个?) -导入XML文件后,将XML字符串解析回矩阵格式。这里我们将数据作为符号XML导入: In[50]:= xml = I

(部分)我使用的对象的矩阵表示如下:

 {
 {1, A,{100,  20, 30},10},
 {2, B,{100}, 0},
 {3, X,{120,20},0},
 {4, C,{},11}
 }
我希望以XML格式在外部存储此数据,如下所示


1002030
100
12020

我正在寻找一个关于如何:

-将矩阵转换为XML(Mathematica命令哪个?)
-导入XML文件后,将XML字符串解析回矩阵格式。这里我们将数据作为符号XML导入:

In[50]:= xml = Import["C:\\Temp\\matrixData.xml"]

Out[50]= XMLObject["Document"][{}, 
 XMLElement["data", {}, 
 {XMLElement["row", {"key" -> "1", "val1" -> "A", "val2" -> "10"}, 
      {XMLElement["occ", {}, {"100"}], XMLElement["occ", {}, {"20"}], 
        XMLElement["occ", {}, {"30"}]}], 
  XMLElement["row", {"key" -> "2", "val1" -> "B", "val2" -> "0"},
      {XMLElement["occ", {}, {"100"}]}],
  XMLElement[ "row", {"key" -> "3", "val1" -> "X","val2" -> "0"}, 
      {XMLElement["occ", {}, {"120"}], XMLElement["occ", {}, {"20"}]}], 
  XMLElement["row", {"key" -> "4", "val1" -> "C", "val2" -> "11"}, {}]}], {}]
这里我们将解析为一个矩阵:

In[51]:= matr = 
 xml /. XMLObject["Document"][{}, data_, _] :> data /. 
     XMLElement["data", _, children_] :> children /. 
         XMLElement["row", attrs_, vals_] :> {"key" /. attrs, 
             "val1" /. attrs, vals /. XMLElement["occ", _, {val_}] :> val, 
             "val2" /. attrs} /. s_String :> ToExpression[s]

 Out[51]= {{1, A, {100, 20, 30}, 10}, {2, B, {100}, 0}, {3,X, {120, 20}, 0}, {4, C, {}, 11}}
由于使用了规则内规则技术,代码简短且经济。我来讨论一下。这项技术有一个很好的应用

反过来说:

XMLObject["Document"][{}, XMLElement["data", {},
  Replace[matr, {key_, val1_, vals_List, val2_} :>
      XMLElement[ "row", {"key" -> ToString[key], "val1" -> ToString[val1], 
          "val2" -> ToString[val2]},
             XMLElement["occ", {}, {ToString[#]}] & /@ vals], {1}]], {}]

我没有显示结果,但它与导入的符号XML相同。您可以使用此符号XML调用
Export
,它将知道如何处理它。

@ndroock1感谢您的接受。顺便说一句,当从XMK解析到矩阵时,我假设您希望
A
B
等作为符号。如果希望它们作为字符串,请将规则
s\u String:>ToExpression[s]
更改为
s\u String/;StringMatchQ[s,NumberString]:>ToExpression[s]
,这样只解析数字。