private Types.AbstractRecord Convert(IRecord record, IEnumerable <string> elements, bool mayRootPathBeImplied, Type recordType) { Action <Types.AbstractRecord, IRecord, Filter.XPathTypeNavigator> converter = ConvertFullRecordField; if (recordType == typeof(Types.BriefRecord)) { converter = ConvertBriefRecordField; } else if (recordType == typeof(Types.SummaryRecord)) { converter = ConvertSummaryRecordField; } else { recordType = typeof(Types.Record); } var ret = Activator.CreateInstance(recordType) as Types.AbstractRecord; ret.Untyped.Add( new XAttribute(XNamespace.Xmlns + _NamespaceManager.LookupPrefix(Namespaces.DublinCoreElementsV11), Namespaces.DublinCoreElementsV11) ); var xptn = new Filter.XPathTypeNavigator(record.GetType()); foreach (string element in elements) { XPathNodeIterator xpni = xptn.Select(element, _NamespaceManager, mayRootPathBeImplied); while (xpni.MoveNext()) { converter(ret, record, (Filter.XPathTypeNavigator)xpni.Current); } } return(ret); }
private Types.AbstractRecord Convert(IRecord record, IEnumerable<string> elements, bool mayRootPathBeImplied, Type recordType) { Action<Types.AbstractRecord, IRecord, Filter.XPathTypeNavigator> converter=ConvertFullRecordField; if (recordType==typeof(Types.BriefRecord)) converter=ConvertBriefRecordField; else if (recordType==typeof(Types.SummaryRecord)) converter=ConvertSummaryRecordField; else recordType=typeof(Types.Record); var ret=Activator.CreateInstance(recordType) as Types.AbstractRecord; ret.Untyped.Add( new XAttribute(XNamespace.Xmlns+_NamespaceManager.LookupPrefix(Namespaces.DublinCoreElementsV11), Namespaces.DublinCoreElementsV11) ); var xptn=new Filter.XPathTypeNavigator(record.GetType()); foreach (string element in elements) { XPathNodeIterator xpni=xptn.Select(element, _NamespaceManager, mayRootPathBeImplied); while (xpni.MoveNext()) converter(ret, record, (Filter.XPathTypeNavigator)xpni.Current); } return ret; }
protected XPathTypeNavigator(XPathTypeNavigator other) { _Context=other._Context; _Root=other._Root; _Current=other._Current; }
protected XPathTypeNavigator(XPathTypeNavigator other) { _Context = other._Context; _Root = other._Root; _Current = other._Current; }
private void ConvertFullRecordField(Types.AbstractRecord fullRecord, IRecord record, Filter.XPathTypeNavigator navigator) { var r = fullRecord as Types.Record; if (navigator.LocalName == "BoundingBox") { object value = navigator.GetValue(record); if (value == null) { return; } // Covariance is a feature of .NET 4.0 http://msdn.microsoft.com/en-us/library/dd233059.aspx var ensg = value as IEnumerable <ISimpleGeometry>; if (ensg == null) { var geom = value as ISimpleGeometry; if (geom != null) { ensg = new ISimpleGeometry[] { geom } } ; } foreach (ISimpleGeometry g in ensg) { try { var box = new Ows100.BoundingBox(); box.InitFromGeometry(g); r.BoundingBox.Add(box); } catch (Exception ex) { try { Logger.Error(CultureInfo.InvariantCulture, m => m("Exception {0} occured while creating bounding box for geometry \"{1}\". Message: \"{2}\".", ex.GetType(), g, ex.Message)); } catch (Exception eex) { Logger.Error(CultureInfo.InvariantCulture, m => m("Exception {0} occured while logging exception {1}. Message: \"{2}\".", eex.GetType(), ex.GetType(), eex.Message)); } } } return; } IList <DC11.DCelement> elements = CreateRecordField(record, navigator); foreach (DC11.DCelement e in elements) { r.Content.DCelement.Add(e); } }
private void ConvertSummaryRecordField(Types.AbstractRecord summaryRecord, IRecord record, Filter.XPathTypeNavigator navigator) { var r = summaryRecord as Types.SummaryRecord; IList <DC11.DCelement> elements = CreateRecordField(record, navigator); if (elements.Count == 0) { return; } switch (navigator.LocalName) { case "abstract": r.@abstract = elements.Cast <DCTerms.@abstract>().ToList <DCTerms.@abstract>(); break; case "format": r.format = elements.Cast <DC11.format>().ToList <DC11.format>(); break; case "identifier": r.identifier = elements.Cast <DC11.identifier>().ToList <DC11.identifier>(); break; case "modified": r.modified = elements.Cast <DCTerms.modified>().ToList <DCTerms.modified>(); break; case "relation": r.relation = elements.Cast <DC11.relation>().ToList <DC11.relation>(); break; case "spatial": r.spatial = elements.Cast <DCTerms.spatial>().ToList <DCTerms.spatial>(); break; case "subject": r.subject = elements.Cast <DC11.subject>().ToList <DC11.subject>(); break; case "title": r.title = elements.Cast <DC11.title>().ToList <DC11.title>(); break; case "type": r.type = (DC11.type)elements[0]; break; } }
private void ConvertBriefRecordField(Types.AbstractRecord briefRecord, IRecord record, Filter.XPathTypeNavigator navigator) { var r = briefRecord as Types.BriefRecord; IList <DC11.DCelement> elements = CreateRecordField(record, navigator); if (elements.Count == 0) { return; } switch (navigator.LocalName) { case "identifier": r.identifier = elements.Cast <DC11.identifier>().ToList <DC11.identifier>(); break; case "title": r.title = elements.Cast <DC11.title>().ToList <DC11.title>(); break; case "type": r.type = (DC11.type)elements[0]; break; } }
protected virtual IList <DC11.DCelement> CreateRecordField(IRecord record, Filter.XPathTypeNavigator navigator) { var ret = new List <DC11.DCelement>(); object value = navigator.GetValue(record); if (value == null) { return(ret); } if ((value is string) || !(value is IEnumerable)) { value = new object[] { value } } ; foreach (object v in (IEnumerable)value) { DC11.DCelement e = null; switch (navigator.LocalName) { case "abstract": e = new DCTerms.@abstract(); break; case "created": e = new DCTerms.created(); break; case "creator": e = new DC11.creator(); break; case "contributor": e = new DC11.contributor(); break; case "date": e = new DC11.date(); break; case "description": e = new DC11.description(); break; case "format": e = new DC11.format(); break; case "identifier": e = new DC11.identifier(); break; case "language": e = new DC11.language(); break; case "modified": e = new DCTerms.modified(); break; case "publisher": e = new DC11.publisher(); break; case "relation": e = new DC11.relation(); break; case "rights": e = new DC11.rights(); break; case "source": e = new DC11.source(); break; case "spatial": e = new DCTerms.spatial(); break; case "subject": e = new DC11.subject(); break; case "title": e = new DC11.title(); break; case "type": e = new DC11.type(); break; case "valid": e = new DCTerms.valid(); break; } if (e != null) { if (navigator.MoveToAttribute("scheme", string.Empty)) { object sch = navigator.GetValue(record); if (sch != null) { e.scheme = new Uri(sch.ToString()); } } e.Untyped.Add(v); ret.Add(e); } } return(ret); }