gRDFContainerUtils->MakeSeq(mDataSource, rdfResource, nsnull);
InitContainer(kRDF_Seq, rdfResource);
RDFContentSinkImpl::OpenObject(const nsIParserNode& aNode){    // an "object" non-terminal is either a "description", a "typed    // node", or a "container", so this change the content sink's    // state appropriately.    nsresult rv;    nsCOMPtr<nsIAtom> tag;    PRInt32 nameSpaceID;    rv = ParseTagString(aNode.GetText(), nameSpaceID, *getter_AddRefs(tag));    if (NS_FAILED(rv)) return rv;    // Figure out the URI of this object, and create an RDF node for it.    nsIRDFResource* rdfResource;    rv = GetIdAboutAttribute(aNode, &rdfResource);    if (NS_FAILED(rv)) return rv;    // Push the element onto the context stack    PushContext(rdfResource, mState);    // Now figure out what kind of state transition we need to    // make. We'll either be going into a mode where we parse a    // description or a container.    PRBool isaTypedNode = PR_TRUE;    if (nameSpaceID == mRDFNameSpaceID) {        isaTypedNode = PR_FALSE;        if (tag.get() == kDescriptionAtom) {            // it's a description            mState = eRDFContentSinkState_InDescriptionElement;        }        else if (tag.get() == kBagAtom) {            // it's a bag container            gRDFContainerUtils->MakeBag(mDataSource, rdfResource, nsnull);            mState = eRDFContentSinkState_InContainerElement;        }        else if (tag.get() == kSeqAtom) {            // it's a seq container            gRDFContainerUtils->MakeSeq(mDataSource, rdfResource, nsnull);            mState = eRDFContentSinkState_InContainerElement;        }        else if (tag.get() == kAltAtom) {            // it's an alt container            gRDFContainerUtils->MakeAlt(mDataSource, rdfResource, nsnull);            mState = eRDFContentSinkState_InContainerElement;        }        else {            // heh, that's not *in* the RDF namespace: just treat it            // like a typed node            isaTypedNode = PR_TRUE;        }    }    if (isaTypedNode) {        // XXX destructively alter "ns" to contain the fully qualified        // tag name. We can do this 'cause we don't need it anymore...        nsAutoString typeStr;        GetNameSpaceURI(nameSpaceID, typeStr);  // XXX append ':' too?        const PRUnichar *unicodeString;        tag->GetUnicode(&unicodeString);        typeStr.Append(unicodeString);        nsCOMPtr<nsIRDFResource> type;        rv = gRDFService->GetUnicodeResource(typeStr.GetUnicode(), getter_AddRefs(type));        if (NS_FAILED(rv)) return rv;        rv = mDataSource->Assert(rdfResource, kRDF_type, type, PR_TRUE);        if (NS_FAILED(rv)) return rv;        mState = eRDFContentSinkState_InDescriptionElement;    }    AddProperties(aNode, rdfResource);    NS_RELEASE(rdfResource);    return NS_OK;}