The control flow, in this example, is going to look something like this:
Figure 1. Control Flow |
The Execute SQL Task will be used to get the list of ATOM and RSS feeds we want to download and load them into a SSIS Object Variable. The table we're going to store this list in is:
CREATE TABLE CFG_FEED_LIST
(
FEED_LINK NVARCHAR(1000)
)
GO
INSERT INTO CFG_FEED_LIST(FEED_LINK)
VALUES ('http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml'),
('http://cnn.com/WORLD/blogs/weatherfx/atom.xml'),
('http://feeds.wired.com/wired/index'),
('http://www.bbc.co.uk/blogs/theeditors/atom.xml'),
('http://boston.cbslocal.com/feed/'),
('http://use.perl.org/use.perl.org/index.atom'),
('http://blah/babab')
GO
Notice I also added an erroneous link http://blah/babab in order to demonstrate what happens when you can't connect to a feed. Now we need to create the object variable that will store our list:
Figure 2. Object Variable |
Figure 3. Execute SQL Task General Screen |
Figure 4. Execute SQL Task Result Set Screen |
Figure 5. Data Flow |
Figure 6. Script Component Source |
Figure 7. Script Component Script Screen |
Figure 8. Script Component Input Output Screen |
#region Namespaces
using System;
using System.Data;
using System.Xml;
using
Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using
Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Windows.Forms;
using System.Text;
using
System.Security.Cryptography;
using System.IO;
using
System.ServiceModel.Syndication;
using System.Data.OleDb;
#endregion
#region Class
/// <summary>
/// This class is used to
extract xml from an RSS or Atom feed and generate a hash value
/// </summary>
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
#region Methods
/// <summary>
/// Generates new output rows
/// </summary>
public override void CreateNewOutputRows()
{
//Holds the XML string
string finalresult;
//Holds Feed Type
string type;
//Holds the calling URI
string feedLink=string.Empty;
//Cast SSIS Object to DataTable
DataTable myTable = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(myTable,
Variables.objFeedList);
//Loop through DataTable for each
RSS/Atom Feed
foreach (DataRow row in myTable.Rows)
{
try
{
//Set feedLink to current URI
in loop
feedLink = row["FEED_LINK"].ToString();
//Reads XML into string
builder from current RSS/Atom link
using (XmlReader reader = XmlReader.Create(feedLink))
{
type =
DetermineAtomRss(reader);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
StringWriter sw = new StringWriter();
doc.Save(sw);
finalresult =
sw.ToString();
}
//If there is XML to output
then add to data flow
if (finalresult != null)
{
//Output the Raw XML and the
Hash of the XML
Output0Buffer.AddRow();
Output0Buffer.RAWXML.AddBlobData(Encoding.Unicode.GetBytes(finalresult));
Output0Buffer.HASHID =
CreateHash(finalresult);
Output0Buffer.FEEDTYPE =
type;
Output0Buffer.CALLINGURI =
feedLink;
}
}
catch (Exception e)
{
failComponent(e.ToString(),
feedLink);
}
}
}
/// <summary>
/// Produces a SHA1 hash for a string
/// </summary>
/// <param name="data">The string passed to generate
a hash</param>
/// <returns>SHA1 hash value for the
string passed</returns>
public static string CreateHash(string data)
{
byte[] dataToHash = (new UnicodeEncoding()).GetBytes(data);
SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
byte[] hashedData =
sha.ComputeHash(dataToHash);
RNGCryptoServiceProvider.Create().GetBytes(dataToHash);
string s = Convert.ToBase64String(hashedData, Base64FormattingOptions.None);
return s;
}
/// <summary>
/// Outputs an error message
/// </summary>
/// <param name="errorMsg">The exception message</param>
/// <param name="feedLink">The calling URI that had a
failure</param>
private void failComponent(string errorMsg, string feedLink)
{
bool fail = false;
IDTSComponentMetaData100 compMetadata = this.ComponentMetaData;
compMetadata.FireError(1, "Error Loading Feed
("+feedLink+")!", errorMsg, "", 0, out fail);
}
/// <summary>
/// This method determines if the feed is
RSS or ATOM
/// </summary>
/// <param name="reader">The XMLReader that contains
the feed</param>
/// <returns>A string that is either
Unknown, ATOM 1.0 or RSS 2.0</returns>
private string DetermineAtomRss(XmlReader reader)
{
//Default type to Unknown
string type = "Unknown";
//See if the atom formatter can read the XML
Atom10FeedFormatter atom = new Atom10FeedFormatter();
if (atom.CanRead(reader))
{
type = "ATOM 1.0";
}
//See if the RSS formatter can read the XML
Rss20FeedFormatter rss = new Rss20FeedFormatter();
if (rss.CanRead(reader))
{
type = "RSS 2.0";
}
return type;
}
#endregion
}
#endregion
Let's step through and explain some of this code. We passed in our objFeedList variable and need to loop through it to get the feeds we need to call. We can do this by passing the values to a DataTable object and iterating through it in a foreach loop:
DataTable myTable = new DataTable();
We then pass the value in the DataTable to a local string variable and grab the feed with the help of an XmlReader:
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.Fill(myTable, Variables.objFeedList);
//Loop through DataTable for each RSS/Atom Feed
foreach (DataRow row in myTable.Rows)
{
....
//Set feedLink to current URI in loop
feedLink = row["FEED_LINK"].ToString();
//Reads XML into a StringWriter from current RSS/Atom link
using (XmlReader reader = XmlReader.Create(feedLink))
{
type = DetermineAtomRss(reader);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
StringWriter sw = new StringWriter();
doc.Save(sw);
finalresult = sw.ToString();
}
We then pass the XmlReader to our DetermineAtomRss method which will return to us Unknown, ATOM 1.0, or RSS 2.0: type = DetermineAtomRss(reader);. We then output our values to the buffer:
//If there is XML to output then add to data flow
if (finalresult != null)
{
//Output the Raw XML and the Hash of the XML
Output0Buffer.AddRow();
Output0Buffer.RAWXML.AddBlobData(Encoding.Unicode.GetBytes(finalresult));
Output0Buffer.HASHID = CreateHash(finalresult);
Output0Buffer.FEEDTYPE = type;
Output0Buffer.CALLINGURI = feedLink;
}
Let's build and save, then slap a data viewer on this and see what we have so far:
Here you can see we have the unique hash for each feed, the XML of the feed, the type of feed and the calling URI. But you may notice that our data viewer only has 6 records, while our table has 7. This is because one of our feeds is bogus http://blah/babab. Errors connecting to feeds will not hinder the processing of feeds that are good, but we will output the errors so we can see what failed:
This data can now be sent to a data destination where the RAW_XML can either be put in a database in a nvarchar(max) column, or in an XML column, or sent to a file destination. However; if you want to parse out the values from the feed and put them into a database you can follow me for a little bit longer in this post.
To parse the data from the feed out so that we can insert into a database we're going to take advantage of a class available in the .net base class library called SyndicationFeed. What's great about this class is that it has a Load method that can take an XmlReader as a parameter and parse out both ATOM and RSS feeds for us. Once we call load all the values are then available to us in properties of the SyndicationFeed. The database schema that is going to act as our data destination is going to look like this:
If you want to use this schema to just stage the data, you can remove the foreign key relationships. I added those so you can see how the data is related. Just about all of the columns in this schema correspond to values stored in the SyndicationFeed. The meta data for this schema can be found in the following matrix:
Figure 9. Data Viewer ATOM/RSS Feeds |
Figure 10. Feed Error Message |
To parse the data from the feed out so that we can insert into a database we're going to take advantage of a class available in the .net base class library called SyndicationFeed. What's great about this class is that it has a Load method that can take an XmlReader as a parameter and parse out both ATOM and RSS feeds for us. Once we call load all the values are then available to us in properties of the SyndicationFeed. The database schema that is going to act as our data destination is going to look like this:
Figure 11. Destination Database Schema |
If you want to use this schema to just stage the data, you can remove the foreign key relationships. I added those so you can see how the data is related. Just about all of the columns in this schema correspond to values stored in the SyndicationFeed. The meta data for this schema can be found in the following matrix:
Database Column | Source(s) | PK/FK | Documentation |
SYNDICATION_FEED.HASH_ID | Generated in Script Component – Feed Source | PK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed) |
SYNDICATION_FEED.ITEM_ID | Generated in Script Component – Parse XML | PK | This is an incremented integer for the main syndication feed and all of its children items. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_FEED.ID | SyndicationFeed.Id
SyndicationFeed.Items.SyndicationItem.Id |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.id(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.id(v=vs.100).aspx |
|
SYNDICATION_FEED.COPYRIGHT | SyndicationFeed.Copyright.Text
SyndicationFeed.Items.SyndicationItem.Copyright.Text |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.copyright(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.copyright(v=vs.100).aspx |
|
SYNDICATION_FEED.DESCRIPTION | SyndicationFeed.Description.Text
((TextSyndicationContent)SyndicationFeed.Items.SyndicationItem.Context).Text |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.description(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.content(v=vs.100).aspx |
|
SYNDICATION_FEED.BASE_URI | SyndicationFeed.BaseUri.AbsoluteUri
SyndicationFeed.Items.SyndicationItem.BaseUri.AbsoluteUri |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.baseuri(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.baseuri(v=vs.100).aspx |
|
SYNDICATION_FEED.IMAGE_URL | SyndicationFeed.ImageUrl.AbsoluteUri | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.imageurl(v=vs.100).aspx | |
SYNDICATION_FEED.IMAGE_STORED | Downloaded in Script Component – Parse XML | This is the image file downloaded from the URI stored in SyndicationFeed.ImageURL.AbsoluteUri | |
SYNDICATION_FEED.GENERATOR | SyndicationFeed.Generator | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.generator(v=vs.100).aspx | |
SYNDICATION_FEED.LANGUAGE | SyndicationFeed.Language | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.language(v=vs.100).aspx | |
SYNDICATION_FEED.LAST_UPDATED_TIME | SyndicationFeed.LastUpdatedTime
SyndicationFeed.Items.SyndicationItem.LastUpdatedTime |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.lastupdatedtime(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.lastupdatedtime(v=vs.100).aspx |
|
SYNDICATION_FEED.RAW_XML | Downloaded in Script Component – Feed Source | This is the XML from the feed | |
SYNDICATION_FEED.TITLE | SyndicationFeed.Title.Text
SyndicationFeed.Items.SyndicationItem.Title.Text |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.title(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.title(v=vs.100).aspx |
|
SYNDICATION_FEED.FEED_TYPE | Generated in Script Component – Feed Source | This indicates whether or not the feed is ATOM 1.0 or RSS 2.0 | |
SYNDICATION_FEED.CALLING_URI | CFG_FEED_LIST.FEED_LINK | This is the URI that was called to get the XML | |
SYNDICATION_FEED.PUB_DATE | SyndicationFeed.Items.SyndicationItem.PublishDate | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.publishdate(v=vs.100).aspx | |
SYNDICATION_FEED.SUMMARY | SyndicationFeed.Items.SyndicationItem.Summary.Text | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.summary(v=vs.100).aspx | |
SYNDICATION_FEED.SUMMARY_TYPE | SyndicationFeed.Items.SyndicationItem.Summary.Type | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.summary(v=vs.100).aspx | |
SYNDICATION_FEED.CONTENT_TYPE | SyndicationFeed.Items.SyndicationItem.Content.Type | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.content(v=vs.100).aspx |
|
SYNDICATION_FEED_ELEMENTS.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_FEED_ELEMENTS.ELEMENT_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this element |
SYNDICATION_FEED_ELEMENTS.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this element record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_FEED_ELEMENTS.OUTER_NAME | SyndicationFeed.ElementExtensions. SyndicationElementExtension.OuterName
SyndicationFeed.Items.SyndicationItem.ElementExtensions. SyndicationElementExtension.OuterName |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.elementextensions(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.elementextensions(v=vs.100).aspx |
|
SYNDICATION_FEED_ELEMENTS.OUTER_NAME_SPACE | SyndicationFeed.ElementExtensions. SyndicationElementExtension.OuterNameSpace
SyndicationFeed.Items.SyndicationItem.ElementExtensions. SyndicationElementExtension.OuterNameSpace |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.elementextensions(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.elementextensions(v=vs.100).aspx |
|
SYNDICATION_FEED_ELEMENTS.VALUE | SyndicationFeed.ElementExtensions.SyndicationElementExtension.GetObject<string>()
SyndicationFeed.Items.SyndicationItem.ElementExtensions. SyndicationElementExtension.GetObject<string>() |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.elementextensions(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.elementextensions(v=vs.100).aspx |
|
SYNDICATION_FEED_ATTRIBUTES.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_FEED_ATTRIBUTES.ATTRIBUTE_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this attribute |
SYNDICATION_FEED_ATTRIBUTES.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this attribute record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_FEED_ATTRIBUTES.NAME | SyndicationFeed.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Key.Name
SyndicationFeed.Items.SyndicationItem.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.attributeextensions(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.attributeextensions(v=vs.100).aspx |
|
SYNDICATION_FEED_ATTRIBUTES.VALUE | SyndicationFeed.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Value
SyndicationFeed.Items.SyndicationItem.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Value |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.attributeextensions(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.attributeextensions(v=vs.100).aspx |
|
SYNDICATION_CONTENT_ATTRIBUTES.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_CONTENT_ATTRIBUTES.ATTRIBUTE_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this attribute |
SYNDICATION_CONTENT_ATTRIBUTES.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this attribute record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_CONTENT_ATTRIBUTES.NAME | SyndicationFeed.Items.SyndicationItem.Content.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.content(v=vs.100).aspx | |
SYNDICATION_CONTENT_ATTRIBUTES.VALUE | SyndicationFeed.Items.SyndicationItem.Content.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Value | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.content(v=vs.100).aspx | |
SYNDICATION_SUMMARY_ATTRIBUTES.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_SUMMARY_ATTRIBUTES.ATTRIBUTE_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this attribute |
SYNDICATION_SUMMARY_ATTRIBUTES.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this attribute record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_SUMMARY_ATTRIBUTES.NAME | SyndicationFeed.Items.SyndicationItem.Summary.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.summary(v=vs.100).aspx | |
SYNDICATION_SUMMARY_ATTRIBUTES.VALUE | SyndicationFeed.Items.SyndicationItem.Summary.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Value | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.summary(v=vs.100).aspx | |
SYNDICATION_PERSONS.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_PERSONS.PERSON_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this person |
SYNDICATION_PERSONS.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this attribute record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_PERSONS.NAME | SyndicationFeed.Authors.SyndicationPerson.Name
SyndicationFeed.Contributors.SyndicationPerson.Name SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson.Name SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson.Name |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_PERSONS.EMAIL | SyndicationFeed.Authors.SyndicationPerson.Email
SyndicationFeed.Contributors.SyndicationPerson.Email SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson.Email SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson.Email |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_PERSONS.URI | SyndicationFeed.Authors.SyndicationPerson.Uri
SyndicationFeed.Contributors.SyndicationPerson. Uri SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson. Uri SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson. Uri |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_PERSONS.TYPE | Generated in Script Component – Parse XML | This can either be Author or Contributor. It determines if this record came from an author collection or a contributor collection | |
SYNDICATION_PERSONS_ELEMENTS.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_PERSONS_ELEMENTS.PERSON_ID | Generated in Script Component – Parse XML | PK/FK | This is an auto generated integer that is used in the composite primary key to uniquely identify the person that is the parent of this element |
SYNDICATION_PERSONS_ELEMENTS.ELEMENT_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this element |
SYNDICATION_PERSONS_ELEMENTS.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this element record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_PERSONS_ELEMENTS.OUTER_NAME | SyndicationFeed.Authors.SyndicationPerson.ElementExtensions.
SyndicationElementExtension.OuterName
SyndicationFeed.Contributors.SyndicationPerson.ElementExtensions. SyndicationElementExtension.OuterName SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson.ElementExtensions. SyndicationElementExtension.OuterName SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson.ElementExtensions. SyndicationElementExtension.OuterName |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_PERSONS_ELEMENTS.OUTER_NAME_SPACE | SyndicationFeed.Authors.SyndicationPerson.ElementExtensions.
SyndicationElementExtension.OuterNameSpace
SyndicationFeed.Contributors.SyndicationPerson.ElementExtensions. SyndicationElementExtension. OuterNameSpace SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson.ElementExtensions. SyndicationElementExtension. OuterNameSpace SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson.ElementExtensions. SyndicationElementExtension. OuterNameSpace |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_PERSONS_ELEMENTS.VALUE | SyndicationFeed.Authors.SyndicationPerson.ElementExtensions.
SyndicationElementExtension.GetObject<string>()
SyndicationFeed.Contributors.SyndicationPerson.ElementExtensions. SyndicationElementExtension.GetObject<string>() SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson.ElementExtensions. SyndicationElementExtension.GetObject<string>() SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson.ElementExtensions. SyndicationElementExtension.GetObject<string>() |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_PERSONS_ATTRIBUTES.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_PERSONS_ATTRIBUTES.PERSON_ID | Generated in Script Component – Parse XML | PK/FK | This is an auto generated integer that is used in the composite primary key to uniquely identify the person that is the parent of this attribute |
SYNDICATION_PERSONS_ ATTRIBUTES.ATTRIBUTE_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this attribute |
SYNDICATION_PERSONS_ ATTRIBUTES.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this attribute record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_PERSONS_ ATTRIBUTES.NAME | SyndicationFeed.Authors.SyndicationPerson.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Key.Name
SyndicationFeed.Contributors.SyndicationPerson. AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson. AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson. AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_PERSONS_ ATTRIBUTES.VALUE | SyndicationFeed.Authors.SyndicationPerson.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Value
SyndicationFeed.Contributors.SyndicationPerson. AttributeExtensions.KeyValuePair<XmlQualifiedName, string>. Value SyndicationFeed.Items.SyndicationItem.Authors.SyndicationPerson. AttributeExtensions.KeyValuePair<XmlQualifiedName, string>. Value SyndicationFeed.Items.SyndicationItem.Contributors.SyndicationPerson. AttributeExtensions.KeyValuePair<XmlQualifiedName, string>. Value |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.authors(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.contributors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.authors(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.contributors(v=vs.100).aspx |
|
SYNDICATION_CATEGORIES.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_CATEGORIES.CATEGORY_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify the category |
SYNDICATION_CATEGORIES.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this category record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_CATEGORIES.LABEL | SyndicationFeed.Categories.SyndicationCategory.Label
SyndicationFeed.Items.SyndicationItem.Categories.SyndicationCategory.Label |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
|
SYNDICATION_CATEGORIES.NAME | SyndicationFeed.Categories.SyndicationCategory.Name
SyndicationFeed.Items.SyndicationItem.Categories.SyndicationCategory.Name |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
|
SYNDICATION_CATEGORIES.SCHEME | SyndicationFeed.Categories.SyndicationCategory.Scheme
SyndicationFeed.Items.SyndicationItem.Categories.SyndicationCategory.Scheme |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
|
SYNDICATION_CATEGORIES_ELEMENTS.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_CATEGORIES_ELEMENTS.CATEGORY_ID | Generated in Script Component – Parse XML | PK/FK | This is an auto generated integer that is used in the composite primary key to uniquely identify the category that is the parent of this element |
SYNDICATION_CATEGORIES_ELEMENTS.ELEMENT_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this element |
SYNDICATION_CATEGORIES_ELEMENTS.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this element record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_CATEGORIES_ELEMENTS.OUTER_NAME | SyndicationFeed.Categories.SyndicationCategory.ElementExtensions. SyndicationElementExtension.OuterName
SyndicationFeed.Items.SyndicationItem.Categories.SyndicationCategory.ElementExtensions. SyndicationElementExtension.OuterName |
PK/FK | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
SYNDICATION_CATEGORIES_ELEMENTS.OUTER_NAME_SPACE | SyndicationFeed.Categories.SyndicationCategory.ElementExtensions. SyndicationElementExtension.OuterNameSpace
SyndicationFeed.Items.SyndicationItem.Categories.SyndicationCategory.ElementExtensions. SyndicationElementExtension.OuterNameSpace |
PK/FK | http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
SYNDICATION_CATEGORIES_ELEMENTS.VALUE | SyndicationFeed.Categories.SyndicationCategory.ElementExtensions. SyndicationElementExtension.GetObject<string>()
SyndicationFeed.Items.SyndicationItem. Categories.SyndicationCategory.ElementExtensions. SyndicationElementExtension.GetObject<string>() |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
|
SYNDICATION_CATEGORIES_ATTRIBUTES.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_CATEGORIES_ATTRIBUTES.CATEGORY_ID | Generated in Script Component – Parse XML | PK/FK | This is an auto generated integer that is used in the composite primary key to uniquely identify the category that is the parent of this attribute |
SYNDICATION_CATEGORIES_ATTRIBUTES.ATTRIBUTE_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this attribute |
SYNDICATION_CATEGORIES_ATTRIBUTES.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this attribute record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_CATEGORIES_ATTRIBUTES.NAME | SyndicationFeed.Categories.SyndicationCategory.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Key.Name
SyndicationFeed.Items.SyndicationItem.Categories.SyndicationCategory.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
|
SYNDICATION_CATEGORIES_ATTRIBUTES.VALUE | SyndicationFeed.Categories.SyndicationCategory.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Value
SyndicationFeed.Items.SyndicationItem.Categories.SyndicationCategory.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Value |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.categories(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.categories(v=vs.100).aspx |
|
SYNDICATION_LINKS.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_LINKS.LINK_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify the link |
SYNDICATION_LINKS.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this link record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_LINKS.BASE_URI | SyndicationFeed.Links.SyndicationLink.BaseUri.AbsoluteUri
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.BaseUri.AbsoluteUri |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS.LENGTH | SyndicationFeed.Links.SyndicationLink.Length
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.Length |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS.MEDIA_TYPE | SyndicationFeed.Links.SyndicationLink.MediaType
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink. MediaType |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS.RELATIONSHIP_TYPE | SyndicationFeed.Links.SyndicationLink.RelationshipType
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink. RelationshipType |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS.TITLE | SyndicationFeed.Links.SyndicationLink.Title
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.Title |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS.URI | SyndicationFeed.Links.SyndicationLink.Uri.AbsoluteUri
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.Uri.AbsoluteUri |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS_ELEMENTS.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_LINKS_ELEMENTS.LINK_ID | Generated in Script Component – Parse XML | PK/FK | This is an auto generated integer that is used in the composite primary key to uniquely identify the link that is the parent of this element |
SYNDICATION_LINKS_ELEMENTS.ELEMENT_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this element |
SYNDICATION_LINKS_ELEMENTS.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this element record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_LINKS_ELEMENTS.OUTER_NAME | SyndicationFeed.Links.SyndicationLink.ElementExtensions.
SyndicationElementExtension.OuterName
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.ElementExtensions. SyndicationElementExtension.OuterName |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS_ELEMENTS.OUTER_NAME_SPACE | SyndicationFeed.Links.SyndicationLink.ElementExtensions.
SyndicationElementExtension.OuterNameSpace
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.ElementExtensions. SyndicationElementExtension.OuterNameSpace |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS_ATTRIBUTES.HASH_ID | Generated in Script Component – Feed Source | PK/FK | This is a SHA1 hash for the entire XML document(ATOM/RSS feed), it is derived from the SYNDICATION_FEED table as a foreign key |
SYNDICATION_LINKS_ATTRIBUTES.LINK_ID | Generated in Script Component – Parse XML | PK/FK | This is an auto generated integer that is used in the composite primary key to uniquely identify the link that is the parent of this attribute |
SYNDICATION_LINKS_ATTRIBUTES.ATTRIBUTE_ID | Generated in Script Component – Parse XML | PK | This is an auto generated integer that is used in the composite primary key to uniquely identify this attribute |
SYNDICATION_LINKS_ATTRIBUTES.ITEM_ID | Generated in Script Component – Parse XML | PK/FK | This is an incremented integer for the main syndication feed that is the parent of this attribute record. The main feed will always have a 0 for item id, while items will begin with 1 and up |
SYNDICATION_LINKS_ATTRIBUTES.NAME | SyndicationFeed.Links.SyndicationLink.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Key.Name
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Key.Name |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
|
SYNDICATION_LINKS_ATTRIBUTES.VALUE | SyndicationFeed.Links.SyndicationLink.AttributeExtensions.KeyValuePair<XmlQualifiedName,
string>.Value
SyndicationFeed.Items.SyndicationItem.Links.SyndicationLink.AttributeExtensions.KeyValuePair<XmlQualifiedName, string>.Value |
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.links(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.links(v=vs.100).aspx |
-->Create Table Scripts
/*
* TABLE:
SYNDICATION_CATEGORIES
*/
CREATE TABLE
SYNDICATION_CATEGORIES(
HASH_ID nvarchar(35) NOT NULL,
CATEGORY_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
LABEL nvarchar(255) NULL,
NAME nvarchar(255) NULL,
SCHEME nvarchar(255) NULL,
CONSTRAINT PK_SYNDICATION_CATEGORIES PRIMARY
KEY CLUSTERED (HASH_ID, CATEGORY_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_CATEGORIES') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_CATEGORIES
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE SYNDICATION_CATEGORIES
>>>'
go
/*
* TABLE:
SYNDICATION_CATEGORIES_ATTRIBUTES
*/
CREATE TABLE
SYNDICATION_CATEGORIES_ATTRIBUTES(
HASH_ID nvarchar(35) NOT NULL,
CATEGORY_ID int NOT
NULL,
ATTRIBUTE_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
NAME nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_CATEGORIES_ATTRIBUTES PRIMARY KEY CLUSTERED (HASH_ID, CATEGORY_ID, ATTRIBUTE_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_CATEGORIES_ATTRIBUTES') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_CATEGORIES_ATTRIBUTES
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_CATEGORIES_ATTRIBUTES >>>'
go
/*
* TABLE:
SYNDICATION_CATEGORIES_ELEMENTS
*/
CREATE TABLE
SYNDICATION_CATEGORIES_ELEMENTS(
HASH_ID nvarchar(35) NOT NULL,
CATEGORY_ID int NOT
NULL,
ELEMENT_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
OUTER_NAME nvarchar(288) NULL,
OUTER_NAME_SPACE nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_CATEGORIES_ELEMENTS PRIMARY KEY CLUSTERED (HASH_ID, CATEGORY_ID, ITEM_ID, ELEMENT_ID)
)
go
IF OBJECT_ID('SYNDICATION_CATEGORIES_ELEMENTS') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_CATEGORIES_ELEMENTS
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_CATEGORIES_ELEMENTS >>>'
go
/*
* TABLE:
SYNDICATION_CONTENT_ATTRIBUTES
*/
CREATE TABLE
SYNDICATION_CONTENT_ATTRIBUTES(
HASH_ID nvarchar(35) NOT NULL,
ATTRIBUTE_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
NAME nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_CONTENT_ATTRIBUTES PRIMARY KEY CLUSTERED (HASH_ID, ITEM_ID, ATTRIBUTE_ID)
)
go
IF OBJECT_ID('SYNDICATION_CONTENT_ATTRIBUTES') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_CONTENT_ATTRIBUTES
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE SYNDICATION_CONTENT_ATTRIBUTES
>>>'
go
/*
* TABLE: SYNDICATION_FEED
*/
CREATE TABLE
SYNDICATION_FEED(
HASH_ID nvarchar(35) NOT NULL,
ITEM_ID int NOT
NULL,
ID nvarchar(255) NULL,
COPYRIGHT nvarchar(255) NULL,
DESCRIPTION nvarchar(max) NULL,
BASE_URI nvarchar(1000) NULL,
IMAGE_URL nvarchar(1000) NULL,
IMAGE_STORED image NULL,
GENERATOR nvarchar(1000) NULL,
LANGUAGE nvarchar(1000) NULL,
LAST_UPDATED_TIME nvarchar(50) NULL,
RAW_XML xml NULL,
TITLE nvarchar(1000) NULL,
FEED_TYPE nvarchar(10) NULL,
CALLING_URI nvarchar(1000) NULL,
PUB_DATE nvarchar(50) NULL,
SUMMARY nvarchar(max) NULL,
SUMMARY_TYPE nvarchar(255) NULL,
CONTENT_TYPE nvarchar(255) NULL,
CONSTRAINT PK_SYNDICATION_FEED PRIMARY
KEY CLUSTERED (HASH_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_FEED') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_FEED >>>'
ELSE
PRINT '<<< FAILED CREATING TABLE SYNDICATION_FEED
>>>'
go
/*
* TABLE:
SYNDICATION_FEED_ATTRIBUTES
*/
CREATE TABLE
SYNDICATION_FEED_ATTRIBUTES(
HASH_ID nvarchar(35) NOT NULL,
ATTRIBUTE_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
NAME nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_FEED_ATTRIBUTES PRIMARY KEY CLUSTERED (HASH_ID, ATTRIBUTE_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_FEED_ATTRIBUTES') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_FEED_ATTRIBUTES
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_FEED_ATTRIBUTES >>>'
go
/*
* TABLE:
SYNDICATION_FEED_ELEMENTS
*/
CREATE TABLE
SYNDICATION_FEED_ELEMENTS(
HASH_ID nvarchar(35) NOT NULL,
ELEMENT_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
OUTER_NAME nvarchar(255) NULL,
OUTER_NAME_SPACE nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_FEED_ELEMENTS PRIMARY
KEY CLUSTERED (HASH_ID, ELEMENT_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_FEED_ELEMENTS') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_FEED_ELEMENTS
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE SYNDICATION_FEED_ELEMENTS
>>>'
go
/*
* TABLE: SYNDICATION_LINKS
*/
CREATE TABLE
SYNDICATION_LINKS(
HASH_ID nvarchar(35) NOT NULL,
LINK_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
BASE_URI nvarchar(1000) NULL,
LENGTH int NULL,
MEDIA_TYPE nvarchar(50) NULL,
RELATIONSHIP_TYPE nvarchar(50) NULL,
TITLE nvarchar(1000) NULL,
URI nvarchar(1000) NULL,
CONSTRAINT PK_SYNDICATION_LINKS PRIMARY
KEY CLUSTERED (HASH_ID, LINK_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_LINKS') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_LINKS >>>'
ELSE
PRINT '<<< FAILED CREATING TABLE SYNDICATION_LINKS
>>>'
go
/*
* TABLE:
SYNDICATION_LINKS_ATTRIBUTES
*/
CREATE TABLE
SYNDICATION_LINKS_ATTRIBUTES(
HASH_ID nvarchar(35) NOT NULL,
LINK_ID int NOT
NULL,
ATTRIBUTE_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
NAME nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_LINKS_ATTRIBUTES PRIMARY KEY CLUSTERED (HASH_ID, LINK_ID, ATTRIBUTE_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_LINKS_ATTRIBUTES') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_LINKS_ATTRIBUTES
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_LINKS_ATTRIBUTES >>>'
go
/*
* TABLE:
SYNDICATION_LINKS_ELEMENTS
*/
CREATE TABLE
SYNDICATION_LINKS_ELEMENTS(
HASH_ID nvarchar(35) NOT NULL,
LINK_ID int NOT
NULL,
ELEMENT_ID int NOT NULL,
ELEMENT_ID int NOT NULL,
ITEM_ID int NOT
NULL,
OUTER_NAME nvarchar(255) NULL,
OUTER_NAME_SPACE nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_LINKS_ELEMENTS PRIMARY KEY CLUSTERED (HASH_ID, LINK_ID, ELEMENT_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_LINKS_ELEMENTS') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_LINKS_ELEMENTS
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_LINKS_ELEMENTS >>>'
go
/*
* TABLE:
SYNDICATION_PERSONS
*/
CREATE TABLE
SYNDICATION_PERSONS(
HASH_ID nvarchar(35) NOT NULL,
PERSON_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
NAME nvarchar(255) NULL,
EMAIL nvarchar(255) NULL,
URI nvarchar(255) NULL,
TYPE nvarchar(20) NULL,
CONSTRAINT PK_SYNDICATION_PERSONS PRIMARY
KEY CLUSTERED (HASH_ID, PERSON_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_PERSONS') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_PERSONS >>>'
ELSE
PRINT '<<< FAILED CREATING TABLE SYNDICATION_PERSONS
>>>'
go
/*
* TABLE:
SYNDICATION_PERSONS_ATTRIBUTES
*/
CREATE TABLE
SYNDICATION_PERSONS_ATTRIBUTES(
HASH_ID nvarchar(35) NOT NULL,
PERSON_ID int NOT
NULL,
ATTRIBUTE_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
NAME nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_PERSONS_ATTRIBUTES PRIMARY KEY CLUSTERED (HASH_ID, PERSON_ID, ATTRIBUTE_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_PERSONS_ATTRIBUTES') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_PERSONS_ATTRIBUTES
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_PERSONS_ATTRIBUTES >>>'
go
/*
* TABLE:
SYNDICATION_PERSONS_ELEMENTS
*/
CREATE TABLE
SYNDICATION_PERSONS_ELEMENTS(
HASH_ID nvarchar(35) NOT NULL,
PERSON_ID int NOT
NULL,
ELEMENT_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
OUTER_NAME nvarchar(255) NULL,
OUTER_NAME_SPACE nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_PERSONS_ELEMENTS PRIMARY KEY CLUSTERED (HASH_ID, PERSON_ID, ELEMENT_ID, ITEM_ID)
)
go
IF OBJECT_ID('SYNDICATION_PERSONS_ELEMENTS') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_PERSONS_ELEMENTS
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_PERSONS_ELEMENTS >>>'
go
/*
* TABLE:
SYNDICATION_SUMMARY_ATTRIBUTES
*/
CREATE TABLE
SYNDICATION_SUMMARY_ATTRIBUTES(
HASH_ID nvarchar(35) NOT NULL,
ATTRIBUTE_ID int NOT
NULL,
ITEM_ID int NOT
NULL,
NAME nvarchar(255) NULL,
VALUE nvarchar(max) NULL,
CONSTRAINT PK_SYNDICATION_SUMMARY_ATTRIBUTES PRIMARY KEY NONCLUSTERED (HASH_ID, ITEM_ID, ATTRIBUTE_ID)
)
go
IF OBJECT_ID('SYNDICATION_SUMMARY_ATTRIBUTES') IS NOT NULL
PRINT '<<< CREATED TABLE SYNDICATION_SUMMARY_ATTRIBUTES
>>>'
ELSE
PRINT '<<< FAILED CREATING TABLE
SYNDICATION_SUMMARY_ATTRIBUTES >>>'
go
/*
* TABLE:
SYNDICATION_CATEGORIES
*/
ALTER TABLE
SYNDICATION_CATEGORIES ADD
CONSTRAINT FK_SYNDICATION_CATEGORIES_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, ITEM_ID)
REFERENCES SYNDICATION_FEED(HASH_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_CATEGORIES_ATTRIBUTES
*/
ALTER TABLE
SYNDICATION_CATEGORIES_ATTRIBUTES ADD CONSTRAINT FK_SYNDICATION_CATEGORIES_ATTRIBUTES_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, CATEGORY_ID, ITEM_ID)
REFERENCES SYNDICATION_CATEGORIES(HASH_ID, CATEGORY_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_CATEGORIES_ELEMENTS
*/
ALTER TABLE
SYNDICATION_CATEGORIES_ELEMENTS ADD CONSTRAINT FK_SYNDICATION_CATEGORIES_ELEMENTS_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, CATEGORY_ID, ITEM_ID)
REFERENCES SYNDICATION_CATEGORIES(HASH_ID, CATEGORY_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_CONTENT_ATTRIBUTES
*/
ALTER TABLE
SYNDICATION_CONTENT_ATTRIBUTES ADD CONSTRAINT FK_SYNDICATION_CONTENT_ATTRIBUTES_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, ITEM_ID)
REFERENCES SYNDICATION_FEED(HASH_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_FEED_ATTRIBUTES
*/
ALTER TABLE
SYNDICATION_FEED_ATTRIBUTES ADD CONSTRAINT FK_SYNDICATION_FEED_ATTRIBUTES_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, ITEM_ID)
REFERENCES SYNDICATION_FEED(HASH_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_FEED_ELEMENTS
*/
ALTER TABLE
SYNDICATION_FEED_ELEMENTS ADD CONSTRAINT FK_SYNDICATION_FEED_ELEMENTS_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, ITEM_ID)
REFERENCES SYNDICATION_FEED(HASH_ID, ITEM_ID)
go
/*
* TABLE: SYNDICATION_LINKS
*/
ALTER TABLE
SYNDICATION_LINKS ADD
CONSTRAINT FK_SYNDICATION_LINKS_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, ITEM_ID)
REFERENCES SYNDICATION_FEED(HASH_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_LINKS_ATTRIBUTES
*/
ALTER TABLE
SYNDICATION_LINKS_ATTRIBUTES ADD CONSTRAINT FK_SYNDICATION_LINKS_ATTRIBUTES_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, LINK_ID, ITEM_ID)
REFERENCES SYNDICATION_LINKS(HASH_ID, LINK_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_LINKS_ELEMENTS
*/
ALTER TABLE
SYNDICATION_LINKS_ELEMENTS ADD CONSTRAINT FK_SYNDICATION_LINKS_ELEMENTS_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, LINK_ID, ITEM_ID)
REFERENCES SYNDICATION_LINKS(HASH_ID, LINK_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_PERSONS
*/
ALTER TABLE
SYNDICATION_PERSONS ADD
CONSTRAINT FK_SYNDICATION_PERSONS_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, ITEM_ID)
REFERENCES SYNDICATION_FEED(HASH_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_PERSONS_ATTRIBUTES
*/
ALTER TABLE
SYNDICATION_PERSONS_ATTRIBUTES ADD CONSTRAINT FK_SYNDICATION_FEED_PERSONS_ATTRIBUTES_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, PERSON_ID, ITEM_ID)
REFERENCES SYNDICATION_PERSONS(HASH_ID, PERSON_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_PERSONS_ELEMENTS
*/
ALTER TABLE
SYNDICATION_PERSONS_ELEMENTS ADD CONSTRAINT FK_SYNDICATION_FEED_PERSONS_ELEMENTS_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, PERSON_ID, ITEM_ID)
REFERENCES SYNDICATION_PERSONS(HASH_ID, PERSON_ID, ITEM_ID)
go
/*
* TABLE:
SYNDICATION_SUMMARY_ATTRIBUTES
*/
ALTER TABLE
SYNDICATION_SUMMARY_ATTRIBUTES ADD CONSTRAINT FK_SYNDICATION_SUMMARY_ATTRIBUTES_HASH_ID_ITEM_ID
FOREIGN KEY (HASH_ID, ITEM_ID)
REFERENCES SYNDICATION_FEED(HASH_ID, ITEM_ID)
go
Now that we have the tables created we can continue with this package. The next thing to look at is the Look up transformation. This is how we are going to filter out feeds we have already processed. If we poll the feed and nothing has changed, we don't need to parse everything out again. We determine if we already loaded this feed by comparing Hashes already stored in the database:
Figure 12. Lookup Transformation Connection Screen |
with the Hash coming in the data flow :
Figure 13. Lookup Transformation Columns Screen |
Because we only care about feeds we don't already have in the database, we need to send rows with no matching entries to the no match output:
Figure 14. Lookup Transformation General Screen |
With this out of the way, we can focus on how the script component is going to parse the XML and get it into this schema. Drag a script component onto the design surface and select Transformation, make sure to connect the data flow path Lookup No Match Output to this:
Figure 15. Script Component Type |
Figure 16. Script Component Input Columns Screen |
On the Inputs and Outputs screen we need to remove the default Output since we are going to create our own set of them that aren't tied to the Input:
Figure 16. Script Component Inputs and Outputs Screen |
Here is the makeup of each of the output's output columns:
- Syndication_Feed_Out
- ITEM_ID DT_I4
- ID DT_I4
- COPYRIGHT DT_WSTR 255
- DESCRIPTION DT_NTEXT
- BASE_URI DT_WSTR 1000
- IMAGE_URL DT_WSTR 1000
- IMAGE_STORED DT_IMAGE
- GENERATOR DT_WSTR 1000
- LANGUAGE DT_WSTR 1000
- LAST_UPDATED_TIME DT_WSTR 50
- TITLE DT_WSTR 1000
- FEED_TYPE DT_WSTR 10
- HASH_ID DT_WSTR 35
- RAW_XML DT_NTEXT
- CALLING_URI DT_WSTR 1000
- PUB_DATE DT_WSTR 50
- SUMMARY DT_NTEXT
- SUMMARY_TYPE DT_WSTR 255
- CONTENT_TYPE DT_WSTR 255
- Syndication_Summary_Attributes_Out
- HASH_ID DT_WSTR 35
- ATTRIBUTE_ID DT_I4
- ITEM_ID DT_I4
- NAME DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Content_Attributes_Out
- HASH_ID DT_WSTR 35
- ATTRIBUTE_ID DT_I4
- ITEM_ID DT_I4
- NAME DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Links_Elements_Out
- HASH_ID DT_WSTR 35
- LINK_ID DT_I4
- ELEMENT_ID DT_I4
- ITEM_ID DT_I4
- OUTER_NAME DT_WSTR 255
- OUTER_NAME_SPACE DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Links_Attributes_Out
- HASH_ID DT_WSTR 35
- LINK_ID DT_I4
- ATTRIBUTE_ID DT_I4
- ITEM_ID DT_I4
- NAME DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Links_Out
- HASH_ID DT_WSTR 35
- LINK_ID DT_I4
- ITEM_ID DT_I4
- LENGTH DT_I8
- MEDIA_TYPE DT_WSTR 50
- RELATIONSHIP_TYPE DT_WSTR 50
- TITLE DT_WSTR 1000
- URI DT_WSTR 1000
- Syndication_Categories_Attributes_Out
- HASH_ID DT_WSTR 35
- CATEGORY_ID DT_I4
- ATTRIBUTE_ID DT_I4
- ITEM_ID DT_I4
- NAME DT_WSTR 255
- VALUE DT_WSTR 255
- Syndication_Categories_Elements_Out
- HASH_ID DT_WSTR 35
- CATEGORY_ID DT_I4
- ELEMENT_ID DT_I4
- ITEM_ID DT_I4
- OUTER_NAME DT_WSTR 255
- OUTER_NAME_SPACE DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Categories_Out
- HASH_ID DT_WSTR 35
- CATEGORY_ID DT_I4
- ITEM_ID DT_I4
- LABEL DT_WSTR 255
- NAME DT_WSTR 255
- SCHEME DT_WSTR 255
- Syndication_Persons_Elements_Out
- HASH_ID DT_WSTR 35
- PERSON_ID DT_I4
- ELEMENT_ID DT_I4
- ITEM_ID DT_I4
- OUTER_NAME DT_WSTR 255
- OUTER_NAME_SPACE DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Persons_Out
- HASH_ID DT_WSTR 35
- PERSON_ID DT_I4
- ITEM_ID DT_I4
- NAME DT_WSTR 255
- EMAIL DT_WSTR 255
- URI DT_WSTR 255
- TYPE DT_WSTR 20
- Syndication_Persons_Attributes_Out
- HASH_ID DT_WSTR 35
- PERSON_ID DT_I4
- ATTRIBUTE_ID DT_I4
- ITEM_ID DT_I4
- NAME DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Feed_Elements_Out
- HASH_ID DT_WSTR 35
- ELEMENT_ID DT_I4
- ITEM_ID DT_I4
- OUTER_NAME DT_WSTR 255
- OUTER_NAME_SPACE DT_WSTR 255
- VALUE DT_NTEXT
- Syndication_Feed_Attributes_Out
- HASH_ID DT_WSTR 35
- ATTRIBUTE_ID DT_I4
- ITEM_ID DT_I4
- NAME DT_WSTR 255
- VALUE DT_NTEXT
Then we're going to alter main.cs and create a bunch of custom methods that can send data to these various outputs. Our altered class is going to look like this:
Figure 17. Main.cs Class Diagram |
Method | Output Buffer | Database Table | ||
ProcessSyndicationCategories | → | Syndication_Categories_Out | → | SYNDICATION_CATEGORIES |
ProcessSyndicationCategoriesAttributes | → | Syndication_Categories_Attributes_Out | → | SYNDICATION_CATEGORIES_ATTRIBUTES |
ProcessSyndicationCategoriesElements | → | Syndication_Categories_Elements_Out | → | SYNDICATION_CATEGORIES_ELEMENTS |
ProcessSyndicationContentAttributes | → | Syndication_Content_Attributes_Out | → | SYNDICATION_CONTENT_ATTRIBUTES |
ProcessSyndicationFeed | → | Syndication_Feed_Out | → | SYNDICATION_FEED |
ProcessSyndicationFeedAttributes | → | Syndication_Feed_Attributes_Out | → | SYNDICATION_FEED_ATTRIBUTES |
ProcessSyndicationFeedElements | → | Syndication_Feed_Elements_Out | → | SYNDICATION_FEED_ELEMENTS |
ProcessSyndicationLinks | → | Syndication_Links_Out | → | SYNDICATION_LINKS |
ProcessSyndicationLinksAttributes | → | Syndication_Links_Attributes_Out | → | SYNDICATION_LINKS_ATTRIBUTES |
ProcessSyndicationLinksElements | → | Syndication_Links_Elements_Out | → | SYNDICATION_LINKS_ELEMENTS |
ProcessSyndicationPersons | → | Syndication_Persons_Out | → | SYNDICATION_PERSONS |
ProcessSyndicationPersonsAttributes | → | Syndication_Persons_Attributes_Out | → | SYNDICATION_PERSONS_ATTRIBUTES |
ProcessSyndicationPersonsElements | → | Syndication_Persons_Elements_Out | → | SYNDICATION_PERSONS_ELEMENTS |
ProcessSyndicationSummaryAttributes | → | Syndication_Summary_Attributes_Out | → | SYNDICATION_SUMMARY_ATTRIBUTES |