1、引见之前,起首回忆下Linq to xml的体式格局读写简朴xml的要领
(1)读取xml
?xml version="1.0" encoding="utf-8"?> <BizADsList> <adData aid="1" image="baidu.jpg" link="www.baidu.com" title="百度"/> <adData aid="2" image="qq.jpg" link="www.qq.com" title="腾讯"/> </BizADsList> var strPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"data\test.xml"); XDocument adList = XDocument.Load(strPath); var ad = from a in adList.Descendants("BizADsList").Elements("adData") select new { image = a.Attribute("image").Value, link = a.Attribute("link").Value, title = a.Attribute("title").Value }; string s = ""; foreach (var a in ad) s += a.image;
(2)写xml
/// <summary> /// 依据获得的Document鸠合生成XML /// </summary> /// <param name="lstDocumentBD"></param> /// <param name="docNE"></param> /// <param name="strSpiderTime"></param> /// <param name="strNewRate"></param> private static void SaveXmlByLstDocument(List<Document> lstDocumentBD, Document docNE, string strSpiderTime, string strNewRate) { try { XDocument xDoc = new XDocument(); XElement xRoot = new XElement(CSpiderConst.XML_ELE_ROOT); //1.组织Device节点 XElement xDevice = new XElement(CSpiderConst.XML_ELE_DEVICE); //2.组织NE节点 XElement xNE = new XElement(CSpiderConst.XML_ELE_NE); foreach (var oDocNE in docNE) { XElement xItem = new XElement(CSpiderConst.XML_ELE_ITEM, new XAttribute(CSpiderConst.XML_PROP_NAME, oDocNE.Key), oDocNE.Value); xNE.Add(xItem); } //这里增添一个<Item name='NewRate'>和<Item name='SpiderTimeEx'>节点用来保留当前此次的利用率和当次的收集时刻 AddNewRateAndSpiderTime(strSpiderTime, strNewRate, xNE); xDevice.Add(xNE); //3.轮回组织BD节点并增添到Device节点中 foreach (var oDocument in lstDocumentBD) { XElement xBD = new XElement(CSpiderConst.XML_ELE_BD); foreach (var oDocBD in oDocument) { XElement xItem = new XElement(CSpiderConst.XML_ELE_ITEM, new XAttribute(CSpiderConst.XML_PROP_NAME, oDocBD.Key), oDocBD.Value); xBD.Add(xItem); } AddNewRateAndSpiderTime(strSpiderTime, strNewRate, xBD); xDevice.Add(xBD); } xRoot.Add(xDevice); xDoc.Add(xRoot); //4.保留到收集器当地,以效劳器的时刻和网元的AssetID来定名 var strDirectoryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ReportFailed\\"); if (!Directory.Exists(strDirectoryPath)) { Directory.CreateDirectory(strDirectoryPath); } xDoc.Save(strDirectoryPath + docNE[TBLDeviceLCBB.PROP_ASSETID] + "_" + strSpiderTime.Replace(":", "_") + ".xml"); } catch { CLogService.Instance.Debug("保留XML失利"); } }
经由过程XDocument、XElement对象和Element()、Elements()两个要领能完成大部分xml文件的操纵。
2、进入本日的正题:读写带定名空间的xml文件。
起首来看一段xml
<?xml version="1.0" encoding="utf-8" ?> <DataSet xmlns="http://WebXml.com.cn/"> <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="getRegion"> <msdata:aa> test </msdata:aa> <xs:element name="getRegion" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:element name="Province"> <xs:sequence> <xs:element name="RegionID" type="xs:string" minOccurs="0"/> <xs:element name="RegionName" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:element> </xs:element> </xs:schema> </DataSet>
第一次看到这个文件确切让人萌神了,比方须要取一个msdata:IsDataSet=”true”这个属性,该怎样取…
剖析之前,先来剖析下这段xml,<DataSet xmlns=”http://WebXml.com.cn/”>这段内里有一个xmlns属性,这个属性是每个标签自带的属性,不信你能够新建一个xml文件,然后在任何一个标签内里输入xmlns属性,背面都邑出来许多的体系自带的定名空间。这个属性示意所属标签在哪一个定名空间下面,所以在取的时刻要带上这个定名空间。
先来看看剖析的代码:
var strPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"data\test.xml"); var oRoot = XDocument.Load(strPath); //取DataSet标签 var oDataSet = oRoot.Element(XName.Get("DataSet", "http://WebXml.com.cn/")); //取schema标签 var oSchema = oDataSet.Element(XName.Get("schema", "http://www.w3.org/2001/XMLSchema")); //取element标签 var oElement = oSchema.Element(XName.Get("element", "http://www.w3.org/2001/XMLSchema"));//这两个节点都是以xs打头,所以定名空间都是xs的定名空间 //取element标签下面的IsDataSet属性 var oElementValue = oElement.Attribute(XName.Get("IsDataSet", "urn:schemas-microsoft-com:xml-msdata")); //取aa标签 var oAA = oSchema.Element(XName.Get("aa", "urn:schemas-microsoft-com:xml-msdata"));
我们来剖析下几个症结的处所:
(1)我们来剖析下
<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="getRegion">
这一句,最前面的”xs”示意标签所属定名空间的变量,xmlns:xs=”http://www.w3.org/2001/XMLSchema”这个示意xs这个定名空间的值。所以要获得schema这个标签须要带上定名空间var oSchema = oDataSet.Element(XName.Get(“schema”, “http://www.w3.org/2001/XMLSchema”));这个标签还定义了另一个定名空间xmlns:msdata=”urn:schemas-microsoft-com:xml-msdata”。
(2)再来看看aa标签
<msdata:aa> test </msdata:aa>
msdata就是上面schema标签内里定义的另一个定名空间,示意aa标签属于msdata定名空间下面。
(3)再看来看属性的取法:
<xs:element name="getRegion" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
假如要取msdata:IsDataSet=”true”,由于这个属性也带有定名空间,所以取属性时也要加上定名空间了。所以须要如许取。
var oElementValue = oElement.Attribute(XName.Get(“IsDataSet”, “urn:schemas-microsoft-com:xml-msdata”));
如今大伙们应当对这类xml有一个越发清楚的熟悉了吧。实在平常情况下这类场景比较少见,由于这么庞杂的xml平常是由援用效劳时代办对象去剖析的。但假如真的有这么变态的需求我们也不必忧郁了。在此记录下,今后假如人人碰到希望能勤俭大伙的时刻。
以上就是C#基本系列:Linq to Xml读写xml的内容,更多相关内容请关注ki4网(www.ki4.cn)!