反序列化& lt; table>从XML复制[][]的节点

本文关键字:复制 节点 XML lt table 反序列化 | 更新日期: 2023-09-27 17:51:02

我有一个包含矩阵值的XML文件(来自某个地方),我希望将其作为double[][]对象放入我的代码中。XML包含表节点,它们看起来像标准的序列化双[][]对象:

<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(因为xelement没有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.错误,我还没有找到解决方案。这让我很恼火

反序列化& lt; table>从XML复制[][]的节点

最好使用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();

您不能使用标准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,或者将其转换为相应的格式。