针对XML的Readonly属性,可以选择两种方式读取XML Document.
查询时,用XPathDocument,快速只读操作。
可写,用XMLDocument。
ObjectXXX el = ReadObject(fileName);
StringBuilder doc = XMLSerializeObject(el);
Navigator = GetXPathNavigator(doc.ToString(), true);
private ObjectXXX ReadObject(string filename)
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read);
ObjectXXX el = (ObjectXXX )formatter.Deserialize(stream);
stream.Close();
stream.Dispose();
return el;
}
private StringBuilder XMLSerializeObject(object classObj)
{
XmlSerializer ser = new XmlSerializer(classObj.GetType());
StringBuilder doc = new StringBuilder();
TextWriter tw = new StringWriter(doc);
ser.Serialize(tw, classObj);
tw.Close();
tw.Dispose();
return doc;
}
public XPathNavigator GetXPathNavigator(string doc, bool isReadOnly)
{
XPathNavigator xpnav = null;
XmlTextReader xmlreader = new XmlTextReader(new StringReader(doc));
XmlTextReader xmlreader = new XmlTextReader(fileName);
try
{
if (isReadOnly)
{
XPathDocument xpdoc = new XPathDocument(xmlreader);
xpnav = xpdoc.CreateNavigator();
}
else
{
XmlDocument xdoc = new XmlDocument();
xdoc.Load(xmlreader);
xpnav = xdoc.CreateNavigator();
}
return xpnav;
}
finally
{
xmlreader.Close();
}
}
如果XMLDocument 有他自己的Namespace的话,则需要添加XMLNamespaceManager.
for example:
newbooks.xml
<?xml version='1.0'?>
<bookstore xmlns=http://test.com>
<book genre="novel" style="hardcover">
<title>The Handmaid's Tale</title>
<author>
<first-name>Margaret</first-name>
<last-name>Atwood</last-name>
</author>
<price>19.95</price>
</book>
<book genre="novel" style="other">
<title>The Poisonwood Bible</title>
<author>
<first-name>Barbara</first-name>
<last-name>Kingsolver</last-name>
</author>
<price>11.99</price>
</book>
</bookstore>
XmlDocument doc = new XmlDocument();
doc.Load("newbooks.xml");
// Create an XmlNamespaceManager to resolve the default namespace.
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("p", "urn:newbooks-schema");
// Select and display all book titles.
XmlNodeList nodeList;
XmlElement root = doc.DocumentElement;
nodeList = root.SelectNodes("/p:bookstore/p:book/p:title", nsmgr);
foreach (XmlNode title in nodeList) {
Console.WriteLine(title.InnerXml);
}