我有一个包含矩阵值的XML文件(来自某处),我希望将其作为double [] []对象加入到我的代码中。 XML包含表节点,看起来像标准的序列化double [] []对象:
<table type="System.Double[][]"><table type="System.Double[]"><el type="System.Double">0.005</el><el type="System.Double">0.001</el><el type="System.Double">0.007</el><el type="System.Double">-0.012</el></table><table type="System.Double[]"><el type="System.Double">0.033</el><el type="System.Double">-0.146</el><el type="System.Double">-0.008</el><el type="System.Double">0.006</el></table><table type="System.Double[]"><el type="System.Double">-0.002</el><el type="System.Double">-0.004</el><el type="System.Double">-0.004</el><el type="System.Double">-0.003</el></table><table type="System.Double[]"><el type="System.Double">0</el><el type="System.Double">0</el><el type="System.Double">0</el><el type="System.Double">0</el></table></table>
由于不是整个XML都是这种形式,我只将这些节点提取为XmlNode(因为XElements没有InnerXml)。让我们称之为myMatrixXmlNode
。
然后,我尝试将其放入MemoryStream中,然后从中反序列化:
var deserializer = new XmlSerializer(typeof(double[][]));
var myMatrix = (double[][])deserializer.Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(myMatrixXmlNode.InnerXml)));
这引发了一个<table xmlns=''> was not expected.
错误,但我还没有找到解决方案..而且我对此非常恼火。
答案 0 :(得分:2)
可能最好使用XDocument来解析它,如下所示: -
var d = XDocument.Parse(testXml);
var r = d.Element("table");
var listOfDoubleArrays = new List<double[]>();
foreach (var outerArrayItem in r.Elements())
{
double[] arr = new double[r.Elements().Count()];
int i = 0;
foreach (var innerArrayItem in outerArrayItem.Elements())
{
arr[i] = System.Convert.ToDouble(innerArrayItem.Value);
i++;
}
listOfDoubleArrays.Add(arr);
}
double[][] result = listOfDoubleArrays.ToArray();
答案 1 :(得分:1)
您无法使用标准Xml序列化程序将此Xml反序列化为double[][]
。
double[][]
Xml序列化的格式如下:
<ArrayOfArrayOfDouble xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<ArrayOfDouble>
<double>1</double>
</ArrayOfDouble>
<ArrayOfDouble>
<double>2</double>
</ArrayOfDouble>
</ArrayOfArrayOfDouble>
您可以尝试使用LinqToXml手动解析Xml或将其转换为相应的格式。