nil*_*ock 4 wolfram-mathematica
(部分)我使用的对象的矩阵表示如下:
{
{1, A,{100, 20, 30},10},
{2, B,{100}, 0},
{3, X,{120,20},0},
{4, C,{},11}
}
Run Code Online (Sandbox Code Playgroud)
我想以XML格式将这些数据存储在外部,如下所示
<data>
<row key ="1"val1 ="A"val2 ="10"> <occ> 100 </ occ> <occ> 20 </ occ> <occ> 30 </ occ> </ row>
<行密钥= "2" VAL1 = "B" VAL2 = "0"> <OCC> 100 </ OCC> </行>
<行密钥= "3" VAL1 = "X" VAL2 = "0"> <OCC> 120 </ occ> <occ> 20 </ occ> </ row>
<row key ="4"val1 ="C"val2 ="11"> </ row>
</ data>
我正在寻找一个如何:
在这里,我们将您的数据导入为符号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"}, {}]}], {}]
Run Code Online (Sandbox Code Playgroud)
在这里我们解析成矩阵:
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}}
Run Code Online (Sandbox Code Playgroud)
由于使用规则规则技术,代码简短且经济.我在这里讨论它.这里可以找到这种技术的一个很好的应用.
这是相反的:
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}]], {}]
Run Code Online (Sandbox Code Playgroud)
我没有显示结果,但它与导入的符号XML相同.您可以Export使用此符号XML 调用它,它将知道如何处理它.