public Node GetNodeById(string id) { var nodePath = Path.Combine(_rootPath, id); if (!Directory.Exists(nodePath)) return null; var metaDataXmlFile = Path.Combine(nodePath, "metadata.xml"); var xmlReaderSettings = new XmlReaderSettings(); xmlReaderSettings.IgnoreWhitespace = true; xmlReaderSettings.IgnoreComments = true; // read metadata.xml var xml2NodesMetadataConverter = new Xml2NodesMetadataConverter(); var nodeMetadata = xml2NodesMetadataConverter.Extract(metaDataXmlFile); dynamic node = new Node(id, nodeMetadata); //read data.xml var dataXmlFile = Path.Combine(nodePath, "data.xml"); using (XmlReader xmlReader = XmlReader.Create(dataXmlFile, xmlReaderSettings)) { bool visitNode = false; while (xmlReader.Read()) { if (!xmlReader.Name.Equals("Node") && visitNode) { if (xmlReader.HasAttributes) { var msdocXml = xmlReader["File"]; var fs = new FileStream(Path.Combine(nodePath, msdocXml), FileMode.Open, FileAccess.Read); var sr = new StreamReader(fs, Encoding.UTF8); var msdoc = new MsDoc(); msdoc.Content = sr.ReadToEnd(); node[xmlReader.Name]= msdoc; sr.Close(); fs.Close(); } else { Type type = NodeMetadataHelper.GetPropertyMetadata(node.Metadata, xmlReader.Name).Type; if (type.Equals(typeof(int))) { node[xmlReader.Name] = Convert.ToInt32(xmlReader.ReadString()); } else if (type.Equals(typeof(decimal))) { node[xmlReader.Name]= Convert.ToDecimal(xmlReader.ReadString()); } else if (type.Equals(typeof(string))) { node[xmlReader.Name]= xmlReader.ReadString(); } } } else if (xmlReader.Name.Equals("Node")) visitNode = true; } } return node; }
public void Test1() { var xml2Converter = new Xml2NodesMetadataConverter(); var nodeMetadata = xml2Converter.Extract(CorrectFileName); nodeMetadata.Name.Should().Be("题目"); }