File Coverage

blib/lib/Syndication/NewsML.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             # $Id: NewsML.pm,v 0.10 2002/02/13 14:01:18 brendan Exp $
2             # Syndication::NewsML.pm
3              
4             $VERSION = sprintf("%d.%02d", q$Revision: 0.10 $ =~ /(\d+)\.(\d+)/);
5             $VERSION_DATE= sprintf("%s", q$Date: 2002/02/13 14:01:18 $ =~ m# (.*) $# );
6              
7             $DEBUG = 1;
8              
9 5     5   58470 use NewsML::Node;
  0            
  0            
10             use NewsML::IdNode;
11             use NewsML::AssignmentNode;
12             use NewsML::CatalogNode;
13             use NewsML::CommentNode;
14             use NewsML::DataNode;
15             use NewsML::DateNode;
16             use NewsML::DOMUtils;
17             use NewsML::FormalNameNode;
18             use NewsML::OriginNode;
19             use NewsML::PartyNode;
20             use NewsML::PropertyNode;
21             use NewsML::References;
22             use NewsML::TopicNode;
23             use NewsML::TopicSetNode;
24             use NewsML::XmlLangNode;
25              
26             use XML::DOM;
27              
28             #
29             # Syndication::NewsML -- initial parser. Maybe this should be Syndication::NewsML::Parser or something?
30             # also grabs the first NewsML element to save time, is that a good idea?
31             # does it mean that you can't grab extra namespace/DTD declarations etc?
32             #
33             package Syndication::NewsML;
34             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::TopicSetNode );
35              
36             sub _init {
37             my ($self, $filename) = @_;
38              
39             $self->{parser} = new XML::DOM::Parser;
40             $self->{doc} = $self->{parser}->parsefile($filename);
41             $self->{node} = $self->{doc}->getElementsByTagName("NewsML", 0)->item(0);
42              
43             $self->{_singleElements}{NewsEnvelope} = REQUIRED;
44             $self->{_multiElements}{NewsItem} = ONEORMORE;
45              
46             return $self;
47             }
48              
49             =pod
50              
51             =head1 NAME
52              
53             Syndication::NewsML -- Parser for NewsML documents
54              
55             =head1 VERSION
56              
57             Version $Revision: 0.10 $, released $Date: 2002/02/13 14:01:18 $
58              
59             =head1 SYNOPSIS
60              
61             use Syndication::NewsML;
62              
63             my $newsml = new Syndication::NewsML("myNewsMLfile.xml");
64             my $env = $newsml->getNewsEnvelope;
65              
66             my $dateAndTime = $env->getDateAndTime->getText;
67              
68             foreach my $newsitem ($newsml->getNewsItemList) {
69             # do something with the news item
70             }
71             ...
72              
73             =head1 DESCRIPTION
74              
75             B parses XML files complying to the NewsML specification, created by the International
76             Press Telecommunications Council (http://www.iptc.org).
77              
78             NewsML is a standard format for the markup of multimedia news content.
79             According to the newsml.org website, NewsML is
80             "An XML-based standard to represent and manage news throughout its lifecycle, including production,
81             interchange, and consumer use."
82              
83             NewsML differs from simpler news markup and syndication standards such as RSS (see the XML::RSS module
84             on your local CPAN) in that RSS files contain B to stories, whereas NewsML can be used to send
85             links or the story itself, plus any associated information such as images, video or audio files, PDF
86             documents, or any other type of data.
87              
88             NewsML also offers much more metadata information than RSS, including links between associated content;
89             the ability to revoke, update or modify previously sent stories; support for sending the same story in
90             multiple languages and/or formats; and a method for user-defined metadata known as Topic Sets.
91              
92             Theoretically you could use RSS to link to articles created in NewsML, although in reality news
93             providers and syndicators are more likely to use a more robust and traceable syndication transport
94             protocol such as ICE (see http://www.icestandard.org).
95              
96             Syndication::NewsML is an object-oriented Perl interface to NewsML documents. It aims to let users manage
97             and create NewsML documents without any specialised NewsML or XML knowledge.
98              
99             =head2 Initialization
100              
101             At the moment the constructor can only take a filename as an argument, as follows:
102              
103             my $newsml = new Syndication::NewsML("file-to-parse.xml");
104              
105             This attaches a parser to the file (using XML::DOM), and returns a reference to the first NewsML
106             tag. (I may decide that this is a bad idea and change it soon)
107              
108             =head2 Reading objects
109              
110             There are six main types of calls:
111              
112             =over 4
113              
114             =item *
115              
116             Return a reference to an array of elements:
117              
118             my $topicsets = $newsml->getTopicSetList;
119              
120             The array can be referenced as @$topicsets, or an individual element can be referenced as $topicsets->[N].
121              
122             =item *
123              
124             Return an actual array of elements:
125              
126             my @topicsets = $newsml->getTopicSetList;
127              
128             The array can be referenced as @topicsets, or an individual element can be referenced as $topicsets[N].
129             In addition you can iterate through an array by saying something like
130              
131             foreach my $topicset ($newsml->getTopicSetList) {
132             ...
133             }
134              
135             =item *
136              
137             Return the size of a list of elements:
138              
139             my $topicsetcount = $newsml->getTopicSetCount;
140              
141             =item *
142              
143             Get an individual element:
144              
145             my $catalog = $topicsets->[0]->getCatalog;
146              
147             =item *
148              
149             Get an attribute of an element (as text):
150              
151             my $href = $catalog->getHref;
152              
153             =item *
154              
155             Get the contents of an element (ie the text between the opening and closing tags):
156              
157             my $urlnode = $catalog->getResourceList->[0]->getUrlList->[0];
158             my $urltext = $urlnode->getText;
159              
160             =back
161              
162             Not all of these calls work for all elements: for example, if an element is defined in the NewsML DTD
163             as having zero or one instances in its parent element, and you try to call getXXXList, B
164             will "croak" an error. Similarly when you call getXXX when the DTD specifies that an element can exist
165             more than once in that context, NewsML.pm will flag an error to the effect that you should be calling
166             getXXXList instead. (The error handling will be improved in the future so that it won't croak
167             fatally -- unless you want that to happen.)
168              
169             The NewsML standard contains some "business rules" also written into the DTD: for example, a NewsItem
170             may contain nothing, a NewsComponent, one or more Update elements, or a TopicSet. For some of these
171             rules, the module is smart enough to detect errors and provide a warning. Again, these warnings will
172             be improved and extended in future versions of this module.
173              
174             =head2 Documentation for all the classes
175              
176             Each NewsML element is represented as a class. This means that you can traverse documents as Perl
177             objects, as seen above.
178              
179             Full documentation of which classes can be used in which documents is beyond me right now (with over
180             120 classes to document), so for now you'll have to work with the examples in the B and
181             B directories to see what's going on. You should be able to get a handle on it fairly quickly.
182              
183             The real problem is that it's hard to know when to use B and when to use B
184             -- that is, when an element can have more than one entry and when it is a singleton. Quite often it
185             isn't obvious from looking at a NewsML document. For now, two ways to work this out are to try it and see
186             if you get an error, or to have a copy of the DTD in front of you. Obviously neither of these is
187             optimal, but documenting all 127 classes just so people can tell this difference is pretty scary as
188             well, and so much documentation would put lots of people off using the module. So I'll probably come
189             up with a reference document listing all the classes and methods, rather than docs for each class, in
190             a future release. If anyone has any better ideas, please let me know.
191              
192             =head1 BUGS
193              
194             None that I know of, but there are probably many. The test suite isn't complete, so not every method
195             is tested, but the major ones (seem to) work fine. Of course, if you find bugs, I'd be very keen to
196             hear about them at B.
197              
198             =head1 SEE ALSO
199              
200             L, L, L, L
201              
202             =head1 AUTHOR
203              
204             Brendan Quinn, Clueful Consulting Pty Ltd
205             (brendan@clueful.com.au)
206              
207             =head1 COPYRIGHT
208              
209             Copyright (c) 2001, 2002, Brendan Quinn. All Rights Reserved.
210             This module is free software. It may be used, redistributed
211             and/or modified under the same terms as Perl itself.
212              
213             =cut
214              
215             #
216             # Syndication::NewsML::Comment -- the actual comment
217             #
218             package Syndication::NewsML::Comment;
219             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode );
220              
221             sub _init {
222             my ($self, $node) = @_;
223             $self->{_attributes}->{TranslationOf} = IMPLIED;
224             $self->{_hasText} = 1;
225             }
226              
227             #
228             # Syndication::NewsML::Catalog -- a container for Resource and TopicUse elements
229             #
230             package Syndication::NewsML::Catalog;
231             @ISA = qw ( Syndication::NewsML::IdNode );
232              
233             sub _init {
234             my ($self, $node) = @_;
235              
236             # Child elements
237             $self->{_multiElements}->{Resource} = ZEROORMORE;
238             $self->{_multiElements}->{TopicUse} = ZEROORMORE;
239             $self->{_attributes}->{Href} = IMPLIED;
240             }
241              
242             #
243             # Syndication::NewsML::TransmissionId --
244             #
245             package Syndication::NewsML::TransmissionId;
246             @ISA = qw( Syndication::NewsML::IdNode );
247              
248             sub _init {
249             my ($self, $node) = @_;
250             $self->{_attributes}->{Repeat} = IMPLIED;
251             $self->{_hasText} = 1;
252             }
253              
254             #
255             # Syndication::NewsML::Update -- modification to an existing NewsItem
256             #
257             package Syndication::NewsML::Update;
258             @ISA = qw ( Syndication::NewsML::IdNode );
259              
260             sub _init {
261             my ($self, $node) = @_;
262              
263             $self->{_multiElements}{InsertBefore} = ZEROORMORE;
264             $self->{_multiElements}{InsertAfter} = ZEROORMORE;
265             $self->{_multiElements}{Replace} = ZEROORMORE;
266             $self->{_multiElements}{Delete} = ZEROORMORE;
267             }
268              
269             #
270             # Syndication::NewsML::Delete -- instruction to delete an element in a NewsItem
271             #
272             package Syndication::NewsML::Delete;
273             @ISA = qw( Syndication::NewsML::IdNode );
274              
275             sub _init {
276             my ($self, $node) = @_;
277              
278             $self->{_attributes}{DuidRef} = REQUIRED;
279             }
280              
281             #
282             # Syndication::NewsML::DerivedFrom
283             #
284             package Syndication::NewsML::DerivedFrom;
285             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CommentNode );
286              
287             sub _init {
288             my ($self, $node) = @_;
289              
290             $self->{_attributes}{NewsItem} = IMPLIED;
291             }
292              
293             #
294             # Syndication::NewsML::AssociatedWith -- reference to associated NewsItem
295             #
296             package Syndication::NewsML::AssociatedWith;
297             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CommentNode );
298              
299             sub _init {
300             my ($self, $node) = @_;
301              
302             $self->{_attributes}{NewsItem} = IMPLIED;
303             }
304              
305             #
306             # Syndication::NewsML::UsageRights -- usage rights for a NewsComponent
307             #
308             package Syndication::NewsML::UsageRights;
309             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::AssignmentNode );
310              
311             sub _init {
312             my ($self, $node) = @_;
313              
314             $self->{_singleElements}{UsageType} = OPTIONAL;
315             $self->{_singleElements}{Geography} = OPTIONAL;
316             $self->{_singleElements}{RightsHolder} = OPTIONAL;
317             $self->{_singleElements}{Limitations} = OPTIONAL;
318             $self->{_singleElements}{StartDate} = OPTIONAL;
319             $self->{_singleElements}{EndDate} = OPTIONAL;
320             }
321              
322             #
323             # Syndication::NewsML::UsageType -- type of usage to which the rights apply
324             #
325             package Syndication::NewsML::UsageType;
326             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::AssignmentNode Syndication::NewsML::XmlLangNode );
327              
328             sub _init {
329             my ($self, $node) = @_;
330             $self->{_hasText} = 1;
331             }
332              
333             #
334             # Syndication::NewsML::TopicUse -- indication of where topic is used in the document
335             #
336             package Syndication::NewsML::TopicUse;
337             @ISA = qw( Syndication::NewsML::IdNode );
338              
339             sub _init {
340             my ($self, $node) = @_;
341              
342             $self->{_attributes}{Topic} = REQUIRED;
343             $self->{_attributes}{Context} = IMPLIED;
344             }
345              
346             #
347             # Syndication::NewsML::Resource
348             #
349             package Syndication::NewsML::Resource;
350             @ISA = qw( Syndication::NewsML::IdNode );
351              
352             sub _init {
353             my ($self, $node) = @_;
354              
355             $self->{_singleElements}{Urn} = OPTIONAL;
356             $self->{_multiElements}{Url} = ZEROORMORE;
357             $self->{_multiElements}{DefaultVocabularyFor} = ZEROORMORE;
358             }
359              
360             #
361             # Syndication::NewsML::Url -- a URL that can be used to locate a resource
362             #
363             package Syndication::NewsML::Url;
364             @ISA = qw( Syndication::NewsML::IdNode );
365              
366             sub _init {
367             my ($self, $node) = @_;
368             $self->{_hasText} = 1;
369             }
370              
371             #
372             # Syndication::NewsML::Urn
373             # A URN that provides a global identifier for a resource. This will typically (but
374             # not necessarily) be a NewsML URN as described in the comment to PublicIdentifier.
375             #
376             package Syndication::NewsML::Urn;
377             @ISA = qw( Syndication::NewsML::IdNode );
378              
379             sub _init {
380             my ($self, $node) = @_;
381             $self->{_hasText} = 1;
382             }
383              
384             #
385             # Syndication::NewsML::TopicSetRef -- reference to another TopicSet somewhere
386             #
387             package Syndication::NewsML::TopicSetRef;
388             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CommentNode );
389              
390             sub _init {
391             my ($self, $node) = @_;
392             $self->{_attributes}{TopicSet} = IMPLIED;
393             }
394              
395             #
396             # Syndication::NewsML::TopicSet -- a container for Topics
397             #
398             package Syndication::NewsML::TopicSet;
399             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CommentNode Syndication::NewsML::CatalogNode
400             Syndication::NewsML::TopicNode Syndication::NewsML::FormalNameNode );
401              
402             sub _init {
403             my ($self, $node) = @_;
404              
405             $self->{_multiElements}{TopicSetRef} = ZEROORMORE;
406             }
407              
408             #
409             # Syndication::NewsML::NewsEnvelope
410             #
411              
412             package Syndication::NewsML::NewsEnvelope;
413             use Carp;
414             @ISA = qw ( Syndication::NewsML::IdNode );
415              
416             sub _init {
417             my ($self, $node) = @_;
418             croak "Error! A NewsML document must contain one and only one NewsEnvelope!" unless defined($node);
419             $self->{_singleElements}{DateAndTime} = REQUIRED;
420             $self->{_singleElements}{TransmissionId} = OPTIONAL;
421             $self->{_singleElements}{SentFrom} = OPTIONAL;
422             $self->{_singleElements}{SentTo} = OPTIONAL;
423             $self->{_singleElements}{Priority} = OPTIONAL;
424             $self->{_multiElements}{NewsService} = ZEROORMORE;
425             $self->{_multiElements}{NewsProduct} = ZEROORMORE;
426             }
427              
428             #
429             # Syndication::NewsML::NewsItem
430             #
431              
432             package Syndication::NewsML::NewsItem;
433             use Carp;
434             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::XmlLangNode );
435              
436             sub _init {
437             my ($self, $node) = @_;
438             croak "Error! A NewsML document must contain at least one NewsItem!" unless defined($node);
439              
440             $self->{_singleElements}{Identification} = REQUIRED;
441             $self->{_singleElements}{NewsManagement} = REQUIRED;
442             $self->{_singleElements}{NewsComponent} = OPTIONAL;
443             $self->{_singleElements}{TopicSet} = OPTIONAL;
444             $self->{_multiElements}{Update} = ZEROORMORE;
445             }
446              
447             # wow! a real method, not an autoload! :-)
448              
449             # getType -- returns "NewsComponent", "Update", "TopicSet" or undef (none of the above)
450             sub getType {
451             my ($self) = @_;
452             return $self->{type} if $self->{type};
453             # else have to check myself
454             if ($self->{node}->getElementsByTagName("NewsComponent", 0)->item(0)) {
455             return $self->{type} = "NewsComponent";
456             } elsif ($self->{node}->getElementsByTagName("Update", 0)->item(0)) {
457             return $self->{type} = "Update";
458             } elsif ($self->{node}->getElementsByTagName("TopicSet", 0)->item(0)) {
459             return $self->{type} = "TopicSet";
460             }
461             return undef;
462             }
463              
464             #
465             # Syndication::NewsML::NewsComponent
466             #
467              
468             package Syndication::NewsML::NewsComponent;
469             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::CommentNode
470             Syndication::NewsML::TopicSetNode Syndication::NewsML::XmlLangNode );
471              
472             sub _init {
473             my ($self, $node) = @_;
474              
475             $self->{_singleElements}{Role} = OPTIONAL;
476             $self->{_singleElements}{NewsLines} = OPTIONAL;
477             $self->{_singleElements}{AdministrativeMetadata} = OPTIONAL;
478             $self->{_singleElements}{RightsMetadata} = OPTIONAL;
479             $self->{_singleElements}{DescriptiveMetadata} = OPTIONAL;
480             $self->{_multiElements}{Metadata} = ZEROORMORE;
481             $self->{_multiElements}{BasisForChoice} = ZEROORMORE;
482             $self->{_multiElements}{NewsItem} = ZEROORMORE;
483             $self->{_multiElements}{NewsItemRef} = ZEROORMORE;
484             $self->{_multiElements}{NewsComponent} = ZEROORMORE;
485             $self->{_multiElements}{ContentItem} = ZEROORMORE;
486             }
487              
488             # may be a nicer/more generic way of doing this, but this will do for now
489             sub getEssential {
490             my ($self) = @_;
491             my $ess = $self->{node}->getAttributeNode("Essential");
492             $self->{"Essential"} = $ess ? $ess->getValue : 'no';
493             }
494              
495             # may be a nicer/more generic way of doing this, but this will do for now
496             sub getEquivalentsList {
497             my ($self) = @_;
498             my $equiv = $self->{node}->getAttributeNode("EquivalentsList");
499             $self->{"EquivalentsList"} = $equiv ? $equiv->getValue : 'no';
500             }
501              
502             # should really do some sanity checking because a NewsComponent can't contain more than one type of
503             # NewsItem/NewsItemRef, NewsComponent, or ContentItem
504              
505             ## Metadata helpers -- so we don't have to delve too deep for not much reason
506              
507             # Administrative Metadata
508             sub getFileName {
509             my ($self) = @_;
510             $self->{"FileName"} = $self->getAdministrativeMetadata->getFileName->getText;
511             }
512              
513             sub getSystemIdentifier {
514             my ($self) = @_;
515             $self->{"SystemIdentifier"} = $self->getAdministrativeMetadata->getSystemIdentifier->getText;
516             }
517              
518             # these two both return Topic objects
519             sub getProvider {
520             my ($self) = @_;
521             $self->{"Provider"} = $self->getAdministrativeMetadata->getProvider->getPartyList->[0]->resolveTopicRef;
522             }
523              
524             sub getCreator {
525             my ($self) = @_;
526             $self->{"Creator"} = $self->getAdministrativeMetadata->getCreator->getPartyList->[0]->resolveTopicRef;
527             }
528              
529             # source and contributor also exist in AdministrativeMetadata, but they both can be multiples
530             # and source can have an extra attr (NewsItem) so let's leave them alone for now
531              
532             # Rights Metadata
533             # should this return text or (an array of) Topic object(s)?
534             sub getCopyrightHolder {
535             my ($self) = @_;
536             my @copyholders;
537             foreach my $copyright ($self->getRightsMetadata->getCopyrightList) {
538             my $text = $copyright->getCopyrightHolder->getText;
539             # ignore text if it's just whitespace
540             push(@copyholders, $text) if $text !~ /^\s*$/;
541             foreach my $origin ($copyright->getCopyrightHolder->getOriginList) {
542             # hard coding [0] here probably isn't good, but when do you have multiple Descriptions?
543             push(@copyholders, $origin->resolveTopicRef->getDescriptionList->[0]->getText);
544             }
545             }
546             $self->{"CopyrightHolder"} = \@copyholders;
547             return wantarray ? @copyholders : join(',', @copyholders);
548             }
549              
550             sub getCopyrightDate {
551             my ($self) = @_;
552             my @copydates;
553             foreach my $copyright ($self->getRightsMetadata->getCopyrightList) {
554             my $text = $copyright->getCopyrightDate->getText;
555             # ignore text if it's just whitespace
556             push(@copydates, $text) if $text !~ /^\s*$/;
557             foreach my $origin ($copyright->getCopyrightDate->getOriginList) {
558             # hard coding [0] here probably isn't good, but when do you have multiple Descriptions?
559             push(@copydates, $origin->resolveTopicRef->getDescriptionList->[0]->getText);
560             }
561             }
562             $self->{"CopyrightDate"} = \@copydates;
563             return wantarray ? @copydates : join(',', @copydates);
564             }
565              
566             # descriptive metadata
567             sub getLanguage {
568             my ($self) = @_;
569             $self->{"Language"} = $self->getDescriptiveMetadata->getLanguageList->[0]->getFormalName;
570             }
571              
572             #
573             # Syndication::NewsML::NewsManagement
574             #
575              
576             package Syndication::NewsML::NewsManagement;
577             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::PropertyNode );
578              
579             sub _init {
580             my ($self, $node) = @_;
581              
582             $self->{_singleElements}{NewsItemType} = REQUIRED;
583             $self->{_singleElements}{FirstCreated} = REQUIRED;
584             $self->{_singleElements}{ThisRevisionCreated} = REQUIRED;
585             $self->{_singleElements}{Status} = REQUIRED;
586             $self->{_singleElements}{StatusWillChange} = OPTIONAL;
587             $self->{_singleElements}{Urgency} = OPTIONAL;
588             $self->{_singleElements}{RevisionHistory} = OPTIONAL;
589             $self->{_multiElements}{DerivedFrom} = ZEROORMORE;
590             $self->{_multiElements}{AssociatedWith} = ZEROORMORE;
591             $self->{_multiElements}{Instruction} = ZEROORMORE;
592             }
593              
594             #
595             # Syndication::NewsML::ContentItem
596             #
597              
598             package Syndication::NewsML::ContentItem;
599             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::CommentNode Syndication::NewsML::DataNode );
600             sub _init {
601             my ($self, $node) = @_;
602             $self->{_singleElements}{MediaType} = OPTIONAL;
603             $self->{_singleElements}{Format} = OPTIONAL;
604             $self->{_singleElements}{MimeType} = OPTIONAL;
605             $self->{_singleElements}{Notation} = OPTIONAL;
606             $self->{_singleElements}{Characteristics} = OPTIONAL;
607             $self->{_attributes}{Href} = IMPLIED;
608             }
609              
610             #
611             # Syndication::NewsML::RevisionHistory -- pointer to a file containing the revision history of a NewsItem
612             #
613              
614             package Syndication::NewsML::RevisionHistory;
615             @ISA = qw ( Syndication::NewsML::IdNode );
616              
617             sub _init {
618             my ($self, $node) = @_;
619              
620             $self->{_attributes}{Href} = REQUIRED;
621             }
622              
623             #
624             # Syndication::NewsML::TopicOccurrence -- this topic appears in the NewsComponent
625             #
626              
627             package Syndication::NewsML::TopicOccurrence;
628             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::AssignmentNode );
629              
630             sub _init {
631             my ($self, $node) = @_;
632             $self->{_attributes}{Topic} = IMPLIED;
633             }
634              
635             #
636             # Syndication::NewsML::MediaType -- media type of a ContentItem
637             #
638              
639             package Syndication::NewsML::MediaType;
640             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
641              
642             sub _init {
643             my ($self, $node) = @_;
644             }
645              
646             #
647             # Syndication::NewsML::Format -- format of a ContentItem
648             #
649              
650             package Syndication::NewsML::Format;
651             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
652              
653             sub _init {
654             my ($self, $node) = @_;
655             }
656              
657             #
658             # Syndication::NewsML::MimeType -- MIME type of a ContentItem
659             #
660              
661             package Syndication::NewsML::MimeType;
662             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
663              
664             sub _init {
665             my ($self, $node) = @_;
666             }
667              
668             #
669             # Syndication::NewsML::Notation -- Notation of a ContentItem
670             #
671              
672             package Syndication::NewsML::Notation;
673             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
674              
675             sub _init {
676             my ($self, $node) = @_;
677             }
678              
679             #
680             # Syndication::NewsML::LabelType -- a user-defined type of Label
681             #
682              
683             package Syndication::NewsML::LabelType;
684             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
685              
686             sub _init {
687             my ($self, $node) = @_;
688             }
689              
690             #
691             # Syndication::NewsML::Urgency -- urgency of a NewsItem
692             #
693              
694             package Syndication::NewsML::Urgency;
695             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
696              
697             sub _init {
698             my ($self, $node) = @_;
699             }
700              
701             #
702             # Syndication::NewsML::FutureStatus -- future status of a NewsItem
703             #
704              
705             package Syndication::NewsML::FutureStatus;
706             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
707              
708             sub _init {
709             my ($self, $node) = @_;
710             }
711              
712             #
713             # Syndication::NewsML::NewsItemType -- type of a NewsItem
714             #
715              
716             package Syndication::NewsML::NewsItemType;
717             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
718              
719             sub _init {
720             my ($self, $node) = @_;
721             }
722              
723             #
724             # Syndication::NewsML::NewsLineType -- type of a NewsLine
725             #
726              
727             package Syndication::NewsML::NewsLineType;
728             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
729              
730             sub _init {
731             my ($self, $node) = @_;
732             }
733              
734             #
735             # Syndication::NewsML::NewsProduct -- product to which these news items belong
736             #
737              
738             package Syndication::NewsML::NewsProduct;
739             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
740              
741             sub _init {
742             my ($self, $node) = @_;
743             }
744              
745             #
746             # Syndication::NewsML::NewsService -- service to which these news items belong
747             #
748              
749             package Syndication::NewsML::NewsService;
750             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
751              
752             sub _init {
753             my ($self, $node) = @_;
754             }
755              
756             #
757             # Syndication::NewsML::Priority -- priority notation of this NewsItem
758             #
759              
760             package Syndication::NewsML::Priority;
761             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
762              
763             sub _init {
764             my ($self, $node) = @_;
765             }
766              
767             #
768             # Syndication::NewsML::Role -- role this NewsComponent plays within its parent
769             #
770              
771             package Syndication::NewsML::Role;
772             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
773              
774             sub _init {
775             my ($self, $node) = @_;
776             }
777              
778             #
779             # Syndication::NewsML::Status -- status of a NewsItem
780             #
781              
782             package Syndication::NewsML::Status;
783             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
784              
785             sub _init {
786             my ($self, $node) = @_;
787             }
788              
789             #
790             # Syndication::NewsML::SubjectCode -- container for Subject codes
791             #
792              
793             package Syndication::NewsML::SubjectCode;
794             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::AssignmentNode );
795              
796             sub _init {
797             my ($self, $node) = @_;
798              
799             $self->{_multiElements}{Subject} = ZEROORMORE;
800             $self->{_multiElements}{SubjectMatter} = ZEROORMORE;
801             $self->{_multiElements}{SubjectDetail} = ZEROORMORE;
802             $self->{_multiElements}{SubjectQualifier} = ZEROORMORE;
803             }
804              
805             #
806             # Syndication::NewsML::Subject -- subject of a NewsItem
807             #
808              
809             package Syndication::NewsML::Subject;
810             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
811              
812             sub _init {
813             my ($self, $node) = @_;
814             }
815              
816             #
817             # Syndication::NewsML::SubjectDetail -- subject detail (?) of a NewsItem
818             #
819              
820             package Syndication::NewsML::SubjectDetail;
821             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
822              
823             sub _init {
824             my ($self, $node) = @_;
825             }
826              
827             #
828             # Syndication::NewsML::SubjectMatter -- subject matter (?) of a NewsItem
829             #
830              
831             package Syndication::NewsML::SubjectMatter;
832             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
833              
834             sub _init {
835             my ($self, $node) = @_;
836             }
837              
838             #
839             # Syndication::NewsML::SubjectQualifier -- subject qualifier (?) of a NewsItem
840             #
841              
842             package Syndication::NewsML::SubjectQualifier;
843             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
844              
845             sub _init {
846             my ($self, $node) = @_;
847             }
848              
849             #
850             # Syndication::NewsML::Relevance -- relevance of a NewsItem to a given target audience
851             #
852              
853             package Syndication::NewsML::Relevance;
854             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
855              
856             sub _init {
857             my ($self, $node) = @_;
858             }
859              
860             #
861             # Syndication::NewsML::Genre -- genre of a NewsComponent
862             #
863              
864             package Syndication::NewsML::Genre;
865             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
866              
867             sub _init {
868             my ($self, $node) = @_;
869             }
870              
871             #
872             # Syndication::NewsML::Language -- a language used in a content item
873             #
874              
875             package Syndication::NewsML::Language;
876             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
877              
878             sub _init {
879             my ($self, $node) = @_;
880             }
881              
882             #
883             # Syndication::NewsML::Limitations -- terms and conditions of usage rights
884             #
885              
886             package Syndication::NewsML::Limitations;
887             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::AssignmentNode Syndication::NewsML::OriginNode );
888              
889             sub _init {
890             my ($self, $node) = @_;
891             $self->{_hasText} = 1;
892             }
893              
894             #
895             # Syndication::NewsML::Characteristics -- physical characteristics of a ContentItem
896             #
897              
898             package Syndication::NewsML::Characteristics;
899             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::PropertyNode);
900              
901             sub _init {
902             my ($self, $node) = @_;
903             $self->{_singleElements}{SizeInBytes} = OPTIONAL;
904             }
905              
906             #
907             # Syndication::NewsML::SizeInBytes -- size of a ContentItem (within Characteristics)
908             #
909              
910             package Syndication::NewsML::SizeInBytes;
911             @ISA = qw ( Syndication::NewsML::IdNode );
912              
913             sub _init {
914             my ($self, $node) = @_;
915             $self->{_hasText} = 1;
916             }
917              
918             #
919             # Syndication::NewsML::SystemIdentifier -- system ID for a NewsItem
920             #
921              
922             package Syndication::NewsML::SystemIdentifier;
923             @ISA = qw ( Syndication::NewsML::IdNode );
924              
925             sub _init {
926             my ($self, $node) = @_;
927             $self->{_hasText} = 1;
928             }
929              
930             #
931             # Syndication::NewsML::ThisRevisionCreated -- date (and possibly time)
932             #
933              
934             package Syndication::NewsML::ThisRevisionCreated;
935             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::DateNode );
936              
937             sub _init {
938             my ($self, $node) = @_;
939             $self->{_hasText} = 1;
940             }
941              
942             #
943             # Syndication::NewsML::MetadataType -- media type of a ContentItem
944             #
945              
946             package Syndication::NewsML::MetadataType;
947             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
948              
949             sub _init {
950             my ($self, $node) = @_;
951             $self->{_hasText} = 1;
952             }
953              
954             # Syndication::NewsML::Encoding -- the actual encoding
955             #
956             package Syndication::NewsML::Encoding;
957             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::DataNode );
958              
959             sub _init {
960             my ($self, $node) = @_;
961             $self->{_attributes}{Notation} = REQUIRED;
962             }
963              
964             # Syndication::NewsML::DataContent -- the actual datacontent
965             #
966             package Syndication::NewsML::DataContent;
967             @ISA = qw( Syndication::NewsML::IdNode );
968              
969             sub _init {
970             my ($self, $node) = @_;
971             $self->{_hasText} = 1;
972             }
973              
974             # stuff to do with parties (yeah!) (oh, not that kind of party)
975              
976             # Syndication::NewsML::Party -- the actual party
977             #
978             package Syndication::NewsML::Party;
979             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
980              
981             sub _init {
982             my ($self, $node) = @_;
983             $self->{_attributes}{Topic} = IMPLIED;
984             }
985              
986             sub resolveTopicRef {
987             my ($self) = @_;
988             my $refnode = Syndication::NewsML::References::findReference($self, $self->getTopic, 0);
989             return new Syndication::NewsML::Topic($refnode);
990             }
991              
992             # Syndication::NewsML::Contributor
993             #
994             package Syndication::NewsML::Contributor;
995             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::PartyNode );
996              
997             sub _init {
998             my ($self, $node) = @_;
999             }
1000              
1001             # Syndication::NewsML::Creator
1002             #
1003             package Syndication::NewsML::Creator;
1004             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::PartyNode );
1005              
1006             sub _init {
1007             my ($self, $node) = @_;
1008             }
1009              
1010             # Syndication::NewsML::Provider
1011             #
1012             package Syndication::NewsML::Provider;
1013             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::PartyNode );
1014              
1015             sub _init {
1016             my ($self, $node) = @_;
1017             }
1018              
1019             # Syndication::NewsML::SentFrom
1020             #
1021             package Syndication::NewsML::SentFrom;
1022             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::PartyNode );
1023              
1024             sub _init {
1025             my ($self, $node) = @_;
1026             }
1027              
1028             # Syndication::NewsML::SentTo
1029             #
1030             package Syndication::NewsML::SentTo;
1031             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::PartyNode );
1032              
1033             sub _init {
1034             my ($self, $node) = @_;
1035             }
1036              
1037             # Syndication::NewsML::Source
1038             #
1039             package Syndication::NewsML::Source;
1040             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::PartyNode );
1041              
1042             sub _init {
1043             my ($self, $node) = @_;
1044             $self->{_attributes}{NewsItem} = IMPLIED;
1045             }
1046              
1047             # Syndication::NewsML::Topic
1048              
1049             # Syndication::NewsML::Topic -- "information about a thing" according to the DTD ;-)
1050             #
1051             package Syndication::NewsML::Topic;
1052             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CommentNode Syndication::NewsML::CatalogNode Syndication::NewsML::PropertyNode);
1053              
1054             sub _init {
1055             my ($self, $node) = @_;
1056             $self->{_multiElements}{TopicType} = ONEORMORE;
1057             $self->{_multiElements}{Description} = ZEROORMORE;
1058             $self->{_multiElements}{FormalName} = ZEROORMORE;
1059             $self->{_attributes}{Details} = IMPLIED;
1060             }
1061              
1062             # Syndication::NewsML::TopicType -- type of a topic (amazing huh?)
1063             #
1064              
1065             package Syndication::NewsML::TopicType;
1066             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
1067              
1068             sub _init {
1069             my ($self, $node) = @_;
1070             }
1071              
1072             # Syndication::NewsML::Description -- formal name as an element, not an attribute, for Topics
1073             #
1074              
1075             package Syndication::NewsML::Description;
1076             @ISA = qw ( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode );
1077              
1078             sub _init {
1079             my ($self, $node) = @_;
1080             $self->{_attributes}{Variant} = IMPLIED;
1081             $self->{_hasText} = 1;
1082             }
1083              
1084             # Syndication::NewsML::FormalName -- formal name as an element, not an attribute, for Topics
1085             #
1086             package Syndication::NewsML::FormalName;
1087             @ISA = qw( Syndication::NewsML::IdNode );
1088              
1089             sub _init {
1090             my ($self, $node) = @_;
1091             $self->{_attributes}{Scheme} = IMPLIED;
1092             $self->{_hasText} = 1;
1093             }
1094              
1095             # Syndication::NewsML::DefaultVocabularyFor
1096             #
1097             package Syndication::NewsML::DefaultVocabularyFor;
1098             @ISA = qw( Syndication::NewsML::IdNode );
1099              
1100             sub _init {
1101             my ($self, $node) = @_;
1102             $self->{_attributes}{Context} = REQUIRED;
1103             $self->{_attributes}{Scheme} = IMPLIED;
1104             }
1105              
1106             # Syndication::NewsML::NameLabel -- label to help users identify a NewsItem
1107             #
1108             package Syndication::NewsML::NameLabel;
1109             @ISA = qw( Syndication::NewsML::IdNode );
1110              
1111             sub _init {
1112             my ($self, $node) = @_;
1113             $self->{_hasText} = 1;
1114             }
1115              
1116             # Syndication::NewsML::NewsItemId -- identifier for a NewsItem (combination of NewsItemId and DateId must
1117             # be unique amongst all NewsItems from this provider)
1118             #
1119             package Syndication::NewsML::NewsItemId;
1120             # subclass Node instead of IdNode as this doesn't have a %localid
1121             @ISA = qw( Syndication::NewsML::Node );
1122              
1123             sub _init {
1124             my ($self, $node) = @_;
1125             $self->{_attributes}{Vocabulary} = IMPLIED;
1126             $self->{_attributes}{Scheme} = IMPLIED;
1127             $self->{_hasText} = 1;
1128             }
1129              
1130             # Syndication::NewsML::NewsItemRef -- reference to another NewsItem somewhere
1131             #
1132             package Syndication::NewsML::NewsItemRef;
1133             # actually this may need more than just CommentNode as it can have zero or more comments...
1134             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CommentNode );
1135              
1136             sub _init {
1137             my ($self, $node) = @_;
1138             $self->{_attributes}{NewsItem} = IMPLIED;
1139             }
1140              
1141             # Syndication::NewsML::NewsLine -- line of arbitrary text
1142             #
1143             package Syndication::NewsML::NewsLine;
1144             @ISA = qw( Syndication::NewsML::IdNode );
1145              
1146             sub _init {
1147             my ($self, $node) = @_;
1148             $self->{_singleElements}{NewsLineType} = REQUIRED;
1149             $self->{_multiElements}{NewsLineText} = ONEORMORE;
1150             }
1151              
1152             # Syndication::NewsML::NewsLines -- container for lines of news in a NewsComponent
1153             #
1154             package Syndication::NewsML::NewsLines;
1155             @ISA = qw( Syndication::NewsML::IdNode );
1156              
1157             sub _init {
1158             my ($self, $node) = @_;
1159             $self->{_multiElements}{HeadLine} = ZEROORMORE;
1160             $self->{_multiElements}{SubHeadLine} = ZEROORMORE;
1161             $self->{_multiElements}{ByLine} = ZEROORMORE;
1162             $self->{_multiElements}{DateLine} = ZEROORMORE;
1163             $self->{_multiElements}{CreditLine} = ZEROORMORE;
1164             $self->{_multiElements}{CopyrightLine} = ZEROORMORE;
1165             $self->{_multiElements}{RightsLine} = ZEROORMORE;
1166             $self->{_multiElements}{SeriesLine} = ZEROORMORE;
1167             $self->{_multiElements}{SlugLine} = ZEROORMORE;
1168             $self->{_multiElements}{KeywordLine} = ZEROORMORE;
1169             $self->{_multiElements}{NewsLine} = ZEROORMORE;
1170             }
1171              
1172             # Syndication::NewsML::AdministrativeMetadata -- the "provenance" of a NewsComponent
1173             #
1174             package Syndication::NewsML::AdministrativeMetadata;
1175             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::PropertyNode );
1176              
1177             sub _init {
1178             my ($self, $node) = @_;
1179             $self->{_singleElements}{FileName} = OPTIONAL;
1180             $self->{_singleElements}{SystemIdentifier} = OPTIONAL;
1181             $self->{_singleElements}{Provider} = OPTIONAL;
1182             $self->{_singleElements}{Creator} = OPTIONAL;
1183             $self->{_multiElements}{Source} = ZEROORMORE;
1184             $self->{_multiElements}{Contributor} = ZEROORMORE;
1185             }
1186              
1187             # Syndication::NewsML::DescriptiveMetadata -- describes the content of a NewsComponent
1188             #
1189             package Syndication::NewsML::DescriptiveMetadata;
1190             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::PropertyNode Syndication::NewsML::AssignmentNode );
1191              
1192             sub _init {
1193             my ($self, $node) = @_;
1194             $self->{_singleElements}{Genre} = OPTIONAL;
1195             $self->{_multiElements}{Language} = ZEROORMORE;
1196             $self->{_multiElements}{SubjectCode} = ZEROORMORE;
1197             $self->{_multiElements}{OfInterestTo} = ZEROORMORE;
1198             $self->{_multiElements}{TopicOccurrence} = ZEROORMORE;
1199             }
1200              
1201             # Syndication::NewsML::Metadata -- user-defined type of metadata
1202             #
1203             package Syndication::NewsML::Metadata;
1204             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::PropertyNode );
1205              
1206             sub _init {
1207             my ($self, $node) = @_;
1208             $self->{_singleElements}{MetadataType} = REQUIRED;
1209             }
1210              
1211             # Syndication::NewsML::RightsMetadata -- user-defined type of metadata
1212             #
1213             package Syndication::NewsML::RightsMetadata;
1214             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CatalogNode Syndication::NewsML::PropertyNode Syndication::NewsML::AssignmentNode );
1215              
1216             sub _init {
1217             my ($self, $node) = @_;
1218             $self->{_multiElements}{Copyright} = ZEROORMORE;
1219             $self->{_multiElements}{UsageRights} = ZEROORMORE;
1220             }
1221              
1222             # Syndication::NewsML::BasisForChoice -- XPATH info to help choose between ContentItems
1223             #
1224             package Syndication::NewsML::BasisForChoice;
1225             @ISA = qw( Syndication::NewsML::IdNode );
1226              
1227             sub _init {
1228             my ($self, $node) = @_;
1229             $self->{_attributes}{Rank} = IMPLIED;
1230             $self->{_hasText} = 1;
1231             }
1232              
1233             # Syndication::NewsML::Origin
1234             #
1235             package Syndication::NewsML::Origin;
1236             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::OriginNode Syndication::NewsML::AssignmentNode );
1237              
1238             sub _init {
1239             my ($self, $node) = @_;
1240             $self->{_attributes}{Href} = IMPLIED;
1241             }
1242              
1243             sub resolveTopicRef {
1244             my ($self) = @_;
1245             my $refnode = Syndication::NewsML::References::findReference($self, $self->getHref, 0);
1246             return new Syndication::NewsML::Topic($refnode);
1247             }
1248              
1249             # Syndication::NewsML::ByLine -- author/creator in natural language
1250             #
1251             package Syndication::NewsML::ByLine;
1252             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1253              
1254             sub _init {
1255             my ($self, $node) = @_;
1256             $self->{_hasText} = 1;
1257             }
1258              
1259             # Syndication::NewsML::Copyright
1260             #
1261             package Syndication::NewsML::Copyright;
1262             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::CommentNode Syndication::NewsML::AssignmentNode );
1263              
1264             sub _init {
1265             my ($self, $node) = @_;
1266             $self->{_singleElements}{CopyrightHolder} = REQUIRED;
1267             $self->{_singleElements}{CopyrightDate} = REQUIRED;
1268             }
1269              
1270             # Syndication::NewsML::CopyrightDate
1271             #
1272             package Syndication::NewsML::CopyrightDate;
1273             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1274              
1275             sub _init {
1276             my ($self, $node) = @_;
1277             $self->{_hasText} = 1;
1278             }
1279              
1280             # Syndication::NewsML::CopyrightHolder
1281             #
1282             package Syndication::NewsML::CopyrightHolder;
1283             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1284              
1285             sub _init {
1286             my ($self, $node) = @_;
1287             $self->{_hasText} = 1;
1288             }
1289              
1290             # Syndication::NewsML::CopyrightLine
1291             #
1292             package Syndication::NewsML::CopyrightLine;
1293             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1294              
1295             sub _init {
1296             my ($self, $node) = @_;
1297             $self->{_hasText} = 1;
1298             }
1299              
1300             # Syndication::NewsML::CreditLine
1301             #
1302             package Syndication::NewsML::CreditLine;
1303             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1304              
1305             sub _init {
1306             my ($self, $node) = @_;
1307             $self->{_hasText} = 1;
1308             }
1309              
1310             # Syndication::NewsML::DateAndTime
1311             #
1312             package Syndication::NewsML::DateAndTime;
1313             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::DateNode );
1314              
1315             sub _init {
1316             my ($self, $node) = @_;
1317             $self->{_hasText} = 1;
1318             }
1319              
1320             # Syndication::NewsML::DateId
1321             #
1322             package Syndication::NewsML::DateId;
1323             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::DateNode );
1324              
1325             sub _init {
1326             my ($self, $node) = @_;
1327             $self->{_hasText} = 1;
1328             }
1329              
1330             # Syndication::NewsML::DateLabel
1331             #
1332             package Syndication::NewsML::DateLabel;
1333             @ISA = qw( Syndication::NewsML::IdNode );
1334              
1335             sub _init {
1336             my ($self, $node) = @_;
1337             $self->{_hasText} = 1;
1338             }
1339              
1340             # Syndication::NewsML::DateLine
1341             #
1342             package Syndication::NewsML::DateLine;
1343             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1344              
1345             sub _init {
1346             my ($self, $node) = @_;
1347             $self->{_hasText} = 1;
1348             }
1349              
1350             # Syndication::NewsML::EndDate
1351             #
1352             package Syndication::NewsML::EndDate;
1353             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::AssignmentNode Syndication::NewsML::OriginNode );
1354              
1355             sub _init {
1356             my ($self, $node) = @_;
1357             $self->{_hasText} = 1;
1358             }
1359              
1360             # Syndication::NewsML::StartDate
1361             #
1362             package Syndication::NewsML::StartDate;
1363             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::AssignmentNode Syndication::NewsML::OriginNode );
1364              
1365             sub _init {
1366             my ($self, $node) = @_;
1367             $self->{_hasText} = 1;
1368             }
1369              
1370             # Syndication::NewsML::FileName
1371             #
1372             package Syndication::NewsML::FileName;
1373             @ISA = qw( Syndication::NewsML::IdNode );
1374              
1375             sub _init {
1376             my ($self, $node) = @_;
1377             $self->{_hasText} = 1;
1378             }
1379              
1380             # Syndication::NewsML::FirstCreated
1381             #
1382             package Syndication::NewsML::FirstCreated;
1383             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::DateNode );
1384              
1385             sub _init {
1386             my ($self, $node) = @_;
1387             $self->{_hasText} = 1;
1388             }
1389              
1390             # Syndication::NewsML::Geography
1391             #
1392             package Syndication::NewsML::Geography;
1393             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::AssignmentNode Syndication::NewsML::OriginNode );
1394              
1395             sub _init {
1396             my ($self, $node) = @_;
1397             $self->{_hasText} = 1;
1398             }
1399              
1400             # Syndication::NewsML::HeadLine
1401             #
1402             package Syndication::NewsML::HeadLine;
1403             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1404              
1405             sub _init {
1406             my ($self, $node) = @_;
1407             $self->{_hasText} = 1;
1408             }
1409              
1410             # Syndication::NewsML::KeywordLine
1411             #
1412             package Syndication::NewsML::KeywordLine;
1413             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1414              
1415             sub _init {
1416             my ($self, $node) = @_;
1417             $self->{_hasText} = 1;
1418             }
1419              
1420             # Syndication::NewsML::NewsLineText
1421             #
1422             package Syndication::NewsML::NewsLineText;
1423             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1424              
1425             sub _init {
1426             my ($self, $node) = @_;
1427             $self->{_hasText} = 1;
1428             }
1429              
1430             # Syndication::NewsML::RightsHolder
1431             #
1432             package Syndication::NewsML::RightsHolder;
1433             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::AssignmentNode Syndication::NewsML::OriginNode );
1434              
1435             sub _init {
1436             my ($self, $node) = @_;
1437             $self->{_hasText} = 1;
1438             }
1439              
1440             # Syndication::NewsML::RightsLine
1441             #
1442             package Syndication::NewsML::RightsLine;
1443             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1444              
1445             sub _init {
1446             my ($self, $node) = @_;
1447             $self->{_hasText} = 1;
1448             }
1449              
1450             # Syndication::NewsML::SeriesLine
1451             #
1452             package Syndication::NewsML::SeriesLine;
1453             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1454              
1455             sub _init {
1456             my ($self, $node) = @_;
1457             $self->{_hasText} = 1;
1458             }
1459              
1460             # Syndication::NewsML::SlugLine
1461             #
1462             package Syndication::NewsML::SlugLine;
1463             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1464              
1465             sub _init {
1466             my ($self, $node) = @_;
1467             $self->{_hasText} = 1;
1468             }
1469              
1470             # Syndication::NewsML::SubHeadLine
1471             #
1472             package Syndication::NewsML::SubHeadLine;
1473             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::XmlLangNode Syndication::NewsML::OriginNode );
1474              
1475             sub _init {
1476             my ($self, $node) = @_;
1477             $self->{_hasText} = 1;
1478             }
1479              
1480             # Syndication::NewsML::Label
1481             #
1482             package Syndication::NewsML::Label;
1483             @ISA = qw( Syndication::NewsML::IdNode );
1484              
1485             sub _init {
1486             my ($self, $node) = @_;
1487             $self->{_singleElements}{LabelType} = REQUIRED;
1488             $self->{_singleElements}{LabelText} = REQUIRED;
1489             }
1490              
1491             # Syndication::NewsML::LabelText
1492             #
1493             package Syndication::NewsML::LabelText;
1494             @ISA = qw( Syndication::NewsML::IdNode );
1495              
1496             sub _init {
1497             my ($self, $node) = @_;
1498             $self->{_hasText} = 1;
1499             }
1500              
1501             # Syndication::NewsML::ProviderId -- should be a domain name apparently
1502             #
1503             package Syndication::NewsML::ProviderId;
1504             @ISA = qw( Syndication::NewsML::IdNode );
1505              
1506             sub _init {
1507             my ($self, $node) = @_;
1508             $self->{_attributes}{Vocabulary} = IMPLIED;
1509             $self->{_hasText} = 1;
1510             }
1511              
1512             # Syndication::NewsML::PublicIdentifier
1513             #
1514             package Syndication::NewsML::PublicIdentifier;
1515             @ISA = qw( Syndication::NewsML::IdNode );
1516              
1517             sub _init {
1518             my ($self, $node) = @_;
1519             $self->{_hasText} = 1;
1520             }
1521              
1522             # Syndication::NewsML::NewsIdentifier
1523             #
1524             package Syndication::NewsML::NewsIdentifier;
1525             @ISA = qw( Syndication::NewsML::IdNode );
1526              
1527             sub _init {
1528             my ($self, $node) = @_;
1529             $self->{_singleElements}{ProviderId} = REQUIRED;
1530             $self->{_singleElements}{DateId} = REQUIRED;
1531             $self->{_singleElements}{NewsItemId} = REQUIRED;
1532             $self->{_singleElements}{RevisionId} = REQUIRED;
1533             $self->{_singleElements}{PublicIdentifier} = REQUIRED;
1534             $self->{_hasText} = 1;
1535             }
1536              
1537             # Syndication::NewsML::RevisionId -- integer representing division
1538             #
1539             package Syndication::NewsML::RevisionId;
1540             @ISA = qw( Syndication::NewsML::IdNode );
1541              
1542             sub _init {
1543             my ($self, $node) = @_;
1544             $self->{_attributes}{PreviousRevision} = REQUIRED;
1545             $self->{_attributes}{Update} = REQUIRED;
1546             $self->{_hasText} = 1;
1547             }
1548              
1549             # Syndication::NewsML::InsertAfter -- content to insert after a designated element
1550             #
1551             package Syndication::NewsML::InsertAfter;
1552             @ISA = qw( Syndication::NewsML::IdNode );
1553              
1554             sub _init {
1555             my ($self, $node) = @_;
1556             $self->{_attributes}{DuidRef} = REQUIRED;
1557             $self->{_hasText} = 1;
1558             }
1559              
1560             # Syndication::NewsML::InsertBefore -- content to insert before a designated element
1561             #
1562             package Syndication::NewsML::InsertBefore;
1563             @ISA = qw( Syndication::NewsML::IdNode );
1564              
1565             sub _init {
1566             my ($self, $node) = @_;
1567             $self->{_attributes}{DuidRef} = REQUIRED;
1568             $self->{_hasText} = 1;
1569             }
1570              
1571             # Syndication::NewsML::Replace -- content to replace a designated element
1572             #
1573             package Syndication::NewsML::Replace;
1574             @ISA = qw( Syndication::NewsML::IdNode );
1575              
1576             sub _init {
1577             my ($self, $node) = @_;
1578             $self->{_attributes}{DuidRef} = REQUIRED;
1579             $self->{_hasText} = 1;
1580             }
1581              
1582             # Syndication::NewsML::Property
1583             #
1584             package Syndication::NewsML::Property;
1585             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::PropertyNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
1586              
1587             sub _init {
1588             my ($self, $node) = @_;
1589             $self->{_attributes}{Value} = IMPLIED;
1590             $self->{_attributes}{ValueRef} = IMPLIED;
1591             $self->{_attributes}{AllowedValues} = IMPLIED;
1592             }
1593              
1594             # Syndication::NewsML::OfInterestTo
1595             #
1596             package Syndication::NewsML::OfInterestTo;
1597             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode Syndication::NewsML::AssignmentNode );
1598              
1599             sub _init {
1600             my ($self, $node) = @_;
1601             $self->{_singleElements}{Relevance} = OPTIONAL;
1602             }
1603              
1604             # Syndication::NewsML::RevisionStatus
1605             #
1606             package Syndication::NewsML::RevisionStatus;
1607             @ISA = qw( Syndication::NewsML::IdNode );
1608              
1609             sub _init {
1610             my ($self, $node) = @_;
1611             $self->{_singleElements}{Status} = REQUIRED;
1612             $self->{_attributes}{Revision} = IMPLIED;
1613             }
1614              
1615             # Syndication::NewsML::StatusWillChange
1616             #
1617             package Syndication::NewsML::StatusWillChange;
1618             @ISA = qw( Syndication::NewsML::IdNode );
1619              
1620             sub _init {
1621             my ($self, $node) = @_;
1622             $self->{_singleElements}{FutureStatus} = REQUIRED;
1623             $self->{_singleElements}{DateAndTime} = REQUIRED;
1624             }
1625              
1626             # Syndication::NewsML::Identification
1627             #
1628             package Syndication::NewsML::Identification;
1629             @ISA = qw( Syndication::NewsML::IdNode );
1630              
1631             sub _init {
1632             my ($self, $node) = @_;
1633             $self->{_singleElements}{NewsIdentifier} = REQUIRED;
1634             $self->{_singleElements}{NameLabel} = OPTIONAL;
1635             $self->{_singleElements}{DateLabel} = OPTIONAL;
1636             $self->{_multiElements}{Label} = ZEROORMORE;
1637             }
1638              
1639             #
1640             # Syndication::NewsML::Instruction
1641             #
1642             package Syndication::NewsML::Instruction;
1643             @ISA = qw( Syndication::NewsML::IdNode Syndication::NewsML::FormalNameNode );
1644              
1645             sub _init {
1646             my ($self, $node) = @_;
1647             $self->{_multiElements}{RevisionStatus} = ZEROORMORE;
1648             }