SophiaFramework UNIVERSE 5.3 |
SophiaFramework UNIVERSE では、 W3C(World Wide Web Consortium) で定義される 12 種類のノードに対応する、 以下の 12 のクラスを使用して DOM ツリーを構築して XML 文書を処理します。 これらのクラスは、すべて SFXXMLNode クラスを継承します。
表 227. ノードタイプ毎の nodeType / nodeName / nodeValue / attributes 属性
クラス名 | ノードの種類 | ノードタイプ(nodeType 属性) | ノードの名前(nodeName 属性) | ノードの値(nodeValue 属性) | 属性(attributes 属性) |
---|---|---|---|---|---|
SFXXMLAttribute | Attribute ノード | ATTRIBUTE_NODE | 属性名 | 属性値 | null |
SFXXMLCDATASection | CDATASection ノード | CDATA_SECTION_NODE | "#cdata-section" | CDATA セクションの内容 | null |
SFXXMLComment | Comment ノード | COMMENT_NODE | "#comment" | コメントの内容 | null |
SFXXMLDocument | Document ノード | DOCUMENT_NODE | "#document" | null | null |
SFXXMLDocumentFragment | DocumentFragment ノード | DOCUMENT_FRAGMENT_NODE | "#document-fragment" | null | null |
SFXXMLDocumentType | DocumentType ノード | DOCUMENT_TYPE_NODE | 文書型名 | null | null |
SFXXMLElement | Element ノード | ELEMENT_NODE | タグ名 | null | 属性リスト(SFXXMLNode::DOMNamedNodeMap 型) |
SFXXMLEntity | Entity ノード | ENTITY_NODE | エンティティ名 | エンティティ参照時の置換文字列 | null |
SFXXMLEntityReference | EntityReference ノード | ENTITY_REFERENCE_NODE | 参照されるエンティティ名 | null | null |
SFXXMLNotation | Notation ノード | NOTATION_NODE | 記法の名前 | null | null |
SFXXMLProcessingInstruction | ProcessingInstruction ノード | PROCESSING_INSTRUCTION_NODE | ターゲット名("<?" から最初の空白文字までのトークン) | 処理命令の内容(ターゲット名の後の最初の非空白文字から "?>" の直前の文字までの内容) | null |
SFXXMLText | Text ノード | TEXT_NODE | "#text" | テキストの内容 | null |
注意 | |
---|---|
nodeType / nodeName / nodeValue 属性の値は、 SFXXMLNode::GetNodeType / SFXXMLNode::GetNodeName / SFXXMLNode::GetNodeValue 関数で取得できます。 |
注意 | |
---|---|
attributes 属性の値は、 Element ノードに対してのみ有効で SFXXMLElement::GetAttributes などの関数で取得できます。 |
表 228. 文書ツリー(Document ノードをルートとする DOM ツリー)の構成要素
ノードの種類 | 子になれるノードの種類 |
---|---|
Document | Element(最大 1 つ)/ ProcessingInstruction / Comment / DocumentType(最大 1 つ) |
Element | Element / ProcessingInstruction / Text / Comment / CDATASection / EntityReference |
ProcessingInstruction | 子ノードを持たない |
Comment | 子ノードを持たない |
DocumentType | 子ノードを持たない |
Text | 子ノードを持たない |
CDATASection | 子ノードを持たない |
EntityReference | Element / ProcessingInstruction / Text / Comment / CDATASection / EntityReference |
表 229. DOM ツリーを構成するノード(Document ノード以外)
ノードの種類 | 子になれるノードの種類 |
---|---|
DocumentFragment | Element / ProcessingInstruction / Text / Comment / CDATASection / EntityReference |
Attribute | Text / EntityReference |
Entity | Element / ProcessingInstruction / Text / Comment / CDATASection / EntityReference |
Notation | 子ノードを持たない |
DocumentFragment | |
---|---|
DocumentFragment とは、 DOM ツリーを操作する際の一時的な作業用サブツリーを作成するための「軽量 (最小限度)」 の Document オブジェクトです。 文書ツリーのあるノードに DocumentFragment ノードを挿入するとき、 実際に挿入されるのは DocumentFragment ノードではなく、DocumentFragment ノードの子が挿入されることに注意してください。 |
DOM(Document Object Model)の仕様 | |
---|---|
W3C DOM レベル 2 コア仕様 : Document Object Model (DOM) Level 2 Core Specification |
SFXXMLAttribute | SFXXMLCDATASection | SFXXMLComment | SFXXMLDocument | SFXXMLDocumentFragment | SFXXMLDocumentType | SFXXMLElement | SFXXMLEntity | SFXXMLEntityReference | SFXXMLNode | SFXXMLNotation | SFXXMLProcessingInstruction | SFXXMLText
コンストラクタ/デストラクタ |
---|
SFXXMLNode(
SFXXMLDocumentPtr owner
) SFXXMLNode クラスのコンストラクタです。
|
SFXXMLNode( Void ) SFXXMLNode クラスのコンストラクタです。
|
~SFXXMLNode( Void ) SFXXMLNode クラスのデストラクタです。
|
パブリック関数 | |
---|---|
SFCError |
AppendChild(
SFXXMLNodeConstPtr newchild
) 【無効】子ノードの最後にノードを追加します。
|
SFCError |
CloneNode(
SFXXMLNodeHandle clonenode
, Bool deep
) 【無効】ノードのコピーを作成します。
|
Bool |
EqualNode(
SFXXMLNodeConstPtr arg
) 指定されたノードと同等かどうかを判定します。
|
DOMNodeListPtr |
GetChildNodes( Void ) 【無効】すべての子ノードを取得します。
|
SFXXMLNodePtr |
GetFirstChild( Void ) 【無効】最初の子ノードを取得します。
|
SFXXMLNodePtr |
GetLastChild( Void ) 【無効】最後の子ノードを取得します。
|
SFXXMLNodePtr |
GetNextSibling( Void ) 【無効】次の兄弟ノードを取得します。
|
ACharConstPtr |
GetNodeName( Void ) 【無効】ノードの名前(nodeName 属性値)を取得します。
|
NodeType |
GetNodeType( Void ) 【無効】ノードタイプ(nodeType 属性値)を取得します。
|
ACharConstPtr |
GetNodeValue( Void ) ノードの値(nodeValue 属性値)を取得します。
|
SFXXMLNodePtr |
GetParentNode( Void ) 【無効】親ノードを取得します。
|
SFXXMLNodePtr |
GetPreviousSibling( Void ) 【無効】前の兄弟ノードを取得します。
|
SFXAnsiString |
GetText( Void ) ノードテキストを取得します。
|
Bool |
HasChildNodes( Void ) 【無効】子ノードを持つかどうかを判定します。
|
SFCError |
InsertBefore(
SFXXMLNodeConstPtr newchild
, SFXXMLNodeConstPtr refchild
) 【無効】ノードを挿入します。
|
Bool |
IsSameNode(
SFXXMLNodeConstPtr other
) 指定されたノードと同一であるか判定します。
|
SFCError |
RemoveChild(
SFXXMLNodeConstPtr oldchild
) 【無効】子孫ノードも含めて子ノードを削除します。
|
SFCError |
ReplaceChild(
SFXXMLNodeConstPtr newchild
, SFXXMLNodeConstPtr oldchild
) 【無効】子ノードを置換します。
|
Void |
SetNodeValue(
ACharConstPtr value
) ノードの値(nodeValue 属性値)を設定します。
|
SFCError |
SetText(
SFXAnsiStringConstRef text
) ノードテキストを設定します。
|
型 |
---|
DOMNamedNodeMap 複数の DOM ノードを名前またはローカル名と名前空間 URI で管理するためのクラスです。
|
DOMNodeList 複数の DOM ノードをリスト形式で管理するためのクラスです。
|
NodeType ノードタイプを表す定数です。
|
[ public, explicit ] SFXXMLNode( SFXXMLDocumentPtr owner // このノードを所有する Document ノード );
[ protected, explicit ] SFXXMLNode(Void);
このコンストラクタは、このノードを所有する Document ノード(SFXXMLDocument) を引数に指定して設定することが可能です。 これ以外は、何も行いません。
[ public, virtual ] virtual ~SFXXMLNode(Void);
このデストラクタは、何も行いません。
[ public, virtual ] SFCError AppendChild( SFXXMLNodeConstPtr newchild // 追加するノード );
SFERR_UNSUPPORTED
この関数は、SFERR_UNSUPPORTED を返します。
注意 | |
---|---|
この関数は無効です。 SFXXMLNode クラスを継承するクラスで実装されている AppendChild 関数を呼び出してください。 |
SFXXMLNode::RemoveChild | SFXXMLNode::ReplaceChild | SFXXMLNode::CloneNode | SFXXMLNode::InsertBefore
[ public, virtual ] SFCError CloneNode( SFXXMLNodeHandle clonenode // コピー先のノード( Handle 型 ) Bool deep // 子ノードを再帰的にコピーするかどうか );
SFERR_UNSUPPORTED
この関数は、SFERR_UNSUPPORTED を返します。
注意 | |
---|---|
この関数は無効です。 SFXXMLNode クラスを継承するクラスで実装されている CloneNode 関数を呼び出してください。 |
SFXXMLNode::RemoveChild | SFXXMLNode::ReplaceChild | SFXXMLNode::AppendChild | SFXXMLNode::InsertBefore
[ public, virtual, const ] Bool EqualNode( SFXXMLNodeConstPtr arg // 比較するノード );
この関数は、指定されたノードと同等かどうか(ノードの内容が同じであるかどうか)を判定します。
2 つのノードが同等であるための条件 | |
---|---|
2 つのノードが同等であるための条件は、以下のように再帰的に定義されます。
|
2 つのノードの同一性の判定 | |
---|---|
2 つのノードが同一であるかどうか(2 つのノードが同じオブジェクトを参照しているかどうか)の判定には、 SFXXMLNode::IsSameNode 関数を使用します。 |
SFXXMLAttribute::EqualNode | SFXXMLDocumentType::EqualNode | SFXXMLElement::EqualNode | SFXXMLNode::IsSameNode
[ public, virtual, const ] DOMNodeListPtr GetChildNodes(Void);
null
SFXXMLNode::DOMNodeList | SFXXMLNode::GetFirstChild | SFXXMLNode::GetLastChild | SFXXMLNode::GetNextSibling | SFXXMLNode::GetParentNode | SFXXMLNode::GetPreviousSibling
[ public, virtual, const ] SFXXMLNodePtr GetFirstChild(Void);
null
SFXXMLNode::GetLastChild | SFXXMLNode::GetChildNodes | SFXXMLNode::GetNextSibling | SFXXMLNode::GetPreviousSibling | SFXXMLNode::GetParentNode
[ public, virtual, const ] SFXXMLNodePtr GetLastChild(Void);
null
SFXXMLNode::GetFirstChild | SFXXMLNode::GetChildNodes | SFXXMLNode::GetNextSibling | SFXXMLNode::GetPreviousSibling | SFXXMLNode::GetParentNode
[ public, virtual, const ] SFXXMLNodePtr GetNextSibling(Void);
null
SFXXMLNode::GetPreviousSibling | SFXXMLNode::GetFirstChild | SFXXMLNode::GetLastChild | SFXXMLNode::GetChildNodes | SFXXMLNode::GetParentNode
[ public, virtual, const ] ACharConstPtr GetNodeName(Void);
null
[ public, virtual, const ] NodeType GetNodeType(Void);
SFXXMLNode::UNKNOWN_NODE
この関数は、SFXXMLNode::UNKNOWN_NODE を返します。
注意 | |
---|---|
この関数は無効です。 SFXXMLNode クラスを継承するクラスで実装されている GetNodeType 関数を呼び出してください。 |
ノードタイプ | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ノードタイプとは、ノードの種類によって内容が異なる nodeType 属性値のことです。 ノードタイプの値は、 W3C DOM レベル 1 勧告 (Document Object Model (DOM) Level 1 Specification ) の NodeType の一覧に記載されている数値と同じです。
|
[ public, virtual, const ] ACharConstPtr GetNodeValue(Void);
null
この関数は、null を返します。
[ public, virtual, const ] SFXXMLNodePtr GetParentNode(Void);
null
SFXXMLNode::GetFirstChild | SFXXMLNode::GetLastChild | SFXXMLNode::GetChildNodes | SFXXMLNode::GetNextSibling | SFXXMLNode::GetPreviousSibling
[ public, virtual, const ] SFXXMLNodePtr GetPreviousSibling(Void);
null
SFXXMLNode::GetNextSibling | SFXXMLNode::GetFirstChild | SFXXMLNode::GetLastChild | SFXXMLNode::GetChildNodes | SFXXMLNode::GetParentNode
[ public, const ] SFXAnsiString GetText(Void);
このノードのノードテキスト
この関数は、このノードのノードテキストを返します。
ノードテキストは、以下のようにノードのタイプによって異なります。
ノードのタイプ | ノードテキスト |
---|---|
Attribute, Element, Entity, EntityReference, DocumentFragment | Comment ノードと Processing Instruction ノードを除く、すべての子ノードのノードテキストの連接(子ノードが存在しない場合、空の文字列) |
Text, CDATASection, Comment, ProcessingInstruction | nodeValue 属性値(GetNodeValue 関数の戻り値と同じ) |
Document, DocumentType, Notation | null |
注意 | |
---|---|
ノードテキストにはマークアップは含まれません。また、空白文字は正規化されません。 |
[ public, virtual, const ] Bool HasChildNodes(Void);
false
[ public, virtual ] SFCError InsertBefore( SFXXMLNodeConstPtr newchild // 挿入するノード SFXXMLNodeConstPtr refchild // 参照ノード、このノードの直前に挿入される );
SFERR_UNSUPPORTED
この関数は、SFERR_UNSUPPORTED を返します。
注意 | |
---|---|
この関数は無効です。 SFXXMLNode クラスを継承するクラスで実装されている InsertBefore 関数を呼び出してください。 |
SFXXMLNode::RemoveChild | SFXXMLNode::ReplaceChild | SFXXMLNode::CloneNode | SFXXMLNode::AppendChild
[ public, virtual, const ] Bool IsSameNode( SFXXMLNodeConstPtr other // 比較するノード );
この関数は、このノードが指定されたノードと同一であるか判定します。
[ public, virtual ] SFCError RemoveChild( SFXXMLNodeConstPtr oldchild // 削除するノード );
SFERR_UNSUPPORTED
この関数は、SFERR_UNSUPPORTED を返します。
注意 | |
---|---|
この関数は無効です。 SFXXMLNode クラスを継承するクラスで実装されている RemoveChild 関数を呼び出してください。 |
SFXXMLNode::AppendChild | SFXXMLNode::ReplaceChild | SFXXMLNode::CloneNode | SFXXMLNode::InsertBefore
[ public, virtual ] SFCError ReplaceChild( SFXXMLNodeConstPtr newchild // 置換後ノード SFXXMLNodeConstPtr oldchild // 置換前ノード );
SFERR_UNSUPPORTED
この関数は、SFERR_UNSUPPORTED を返します。
注意 | |
---|---|
この関数は無効です。 SFXXMLNode クラスを継承するクラスで実装されている ReplaceChild 関数を呼び出してください。 |
SFXXMLNode::AppendChild | SFXXMLNode::RemoveChild | SFXXMLNode::CloneNode | SFXXMLNode::InsertBefore
[ public, virtual ] Void SetNodeValue( ACharConstPtr value // ノードの値 );
この関数は、何も行いません。
[ public ] SFCError SetText( SFXAnsiStringConstRef text // 設定するノードテキスト );
この関数は、このノードに指定されたノードテキストを設定します。
この関数の動作は、以下のようにノードのタイプによって異なります。
ノードのタイプ | SFXXMLNode::SetText 関数の動作 |
---|---|
Attribute, Element, Entity, EntityReference, DocumentFragment | 子ノードをすべて削除し、指定されたノードテキストを nodeValue 属性値として持つ Text ノードを子ノードとして追加します。 |
Text, CDATASection, Comment, ProcessingInstruction | 指定されたノードテキストを引数にして SetNodeValue 関数を呼び出します。 |
Document, DocumentType, Notation | 何も処理しません。 |
[ public ] SFMTYPEDEFCLASS(DOMNamedNodeMap) class DOMNamedNodeMap { private: SFXXMLNodePtr _ownerNode; DOMNodeList _namenodelist; public: explicit DOMNamedNodeMap (Void); ~DOMNamedNodeMap (Void); public: SInt32 GetLength (Void) const; SFXXMLNodePtr Item (SInt32 index) const; SFXXMLNodePtr GetNamedItem (SFXAnsiStringConstRef name) const; SFCError SetNamedItem (SFXXMLNodeConstPtr arg); SFXXMLNodePtr RemoveNamedItem (SFXAnsiStringConstRef name); SFXXMLNodePtr GetNamedItemNS (SFXAnsiStringConstRef localname, SFXAnsiStringConstRef namespaceURI) const; SFCError SetNamedItemNS (SFXXMLNodeConstPtr arg); SFXXMLNodePtr RemoveNamedItemNS (SFXAnsiStringConstRef localname, SFXAnsiStringConstRef namespaceURI); protected: inline Void SetOwnerNode (SFXXMLNodePtr node) { _ownerNode = node; return; } friend class SFXXMLElement; friend class SFXXMLDocumentType; };
このクラスは、 複数の DOM ノードを管理するためのクラスです。
このクラスでは、名前(nodeName 属性値)を指定してノードを操作することが可能です。 また、インデックスを指定してノードにアクセスすることも可能です(ノード間に順序関係はありません)。
SFXXMLNode::DOMNamedNodeMap クラスは、以下のメンバ関数を持ちます。
Item | マップの index 番目の項目を返します。 |
GetLength | マップのノード数を取得します。 |
Merge | 指定されたマップの内容を併合します。 |
GetNamedItem | 指定された名前(修飾名の場合もある)を持つノードを取得します。 |
RemoveNamedItem | 指定された名前(修飾名の場合もある)を持つノードをマップから削除します。 |
SetNamedItem | 指定されたノードをマップに追加します。 指定されたノードの名前(修飾名の場合もある)と同じ名前のノードがマップ内に存在する場合は、既存のノードは削除されます。 |
GetNamedItemNS | 指定されたローカル名と名前空間 URI を持つノードを取得します。 |
RemoveNamedItemNS | 指定されたローカル名と名前空間 URI を持つノードをマップから削除します。 |
SetNamedItemNS | 指定されたノードをマップに追加します。 指定されたノードのローカル名と名前空間 URI を持つノードがマップ内に存在する場合は、既存のノードは削除されます。 |
注意 | |
---|---|
上の表で、名前は nodeName 属性値(SFXXMLNode::GetNodeName 関数で取得できるノードの名前)を表します。 GetNamedItem / RemoveNamedItem / SetNamedItem 関数を使用して名前でノードにアクセスする場合、 名前空間が設定されていれば修飾名でアクセスする場合もあります。 ローカル名と名前空間 URI でノードにアクセスする場合は、 GetNamedItemNS / RemoveNamedItemNS / SetNamedItemNS 関数を使用します。 |
// 解析対象の XML 文書( apple.xml )
<fruit>
<name made="japan" date="2007-06-20" size="XS">apple</name>
</fruit>
SFXXMLNode::DOMNamedNodeMap クラスを使ったサンプルコードです。
SFCError error; // エラー値 SFXXMLDOMParser parser; // DOM パーサー SFXAnsiString resultString; // Attribute ノードの値を格納する変数 // XML 文書 "/apple.xml" を解析する if ((error = parser.Parse("/apple.xml")) == SFERR_NO_ERROR) { // DOM ツリーのルートノードを取得する SFXXMLDocumentPtr root = parser.GetDocument(); // XML 文書のルート要素(DOM ツリーのルートノードの最初の子ノード。この場合、fruit 要素)を取得する SFXXMLNodePtr child = root->GetFirstChild(); // fruit 要素の最初の子ノード ( name 要素 )を取得する child = child->GetFirstChild(); // name 要素のすべての Attribute ノードを取得する SFXXMLNode::DOMNamedNodeMapPtr nodeMap = SFXXMLElementPtr(child)->GetAttributes(); // Attribute ノード数を表示する(マップのノード数を表示する) TRACE("%d",nodeMap->GetLength()); // "3" が表示される for (int i = 0; i < nodeMap->GetLength(); i++) { SFXXMLNodePtr node = nodeMap->Item(i); // マップの i 番目の項目(Attribute ノード)を取得する resultString = node->GetNodeValue(); // マップの i 番目の項目(Attribute ノード)の値を取得する // 取得した項目(Attribute ノード)の値を表示する TRACE("%s",resultString.GetCString()); } // name 要素のすべての属性値 "XS", "2007-06-20", "japan" が表示される // "date " という名前のノードを取得する SFXXMLAttributePtr date = static_cast<SFXXMLAttributePtr>(nodeMap->GetNamedItem( "date ")); // "date " という名前のノードの値を取得する resultString = date->GetNodeValue(); // 取得した項目(Attribute ノード)の値を表示する TRACE("%s",resultString.GetCString()); // "2007-06-20" が表示される // "made" という名前のノードをマップから削除する SFXXMLNodePtr remove = nodeMap->RemoveNamedItem("made"); // "made" という名前のノードを削除する ::delete remove; // Attribute ノード数を表示する(マップのノード数を表示する) TRACE("%d",nodeMap->GetLength()); // "2" が表示される for (int i = 0; i < nodeMap->GetLength(); i++) { SFXXMLNodePtr node = nodeMap->Item(i); // マップの i 番目の項目(Attribute ノード)を取得する resultString = node->GetNodeValue(); // マップの i 番目の項目(Attribute ノード)の値を取得する // 取得した項目(Attribute ノード)の値を表示する TRACE("%s",resultString.GetCString()); } // name 要素のすべての属性値 "2007-06-20", "japan" が表示される // ノードをマップに追加する nodeMap->SetNamedItem(root->CreateAttribute("color", "red")); // Attribute ノード数を表示する(マップのノード数を表示する) TRACE("%d",nodeMap->GetLength()); // "3" が表示される for (int i = 0; i < nodeMap->GetLength(); i++) { SFXXMLNodePtr node = nodeMap->Item(i); // マップの i 番目の項目(Attribute ノード)を取得する resultString = node->GetNodeValue(); // マップの i 番目の項目(Attribute ノード)の値を取得する // 取得した項目(Attribute ノード)の値を表示する TRACE("%s",resultString.GetCString()); } // name 要素のすべての属性値 "XS" "2007-06-20" "red"が表示される }
SFMTYPEDEFALIAS(SFXList<SFXXMLNodePtr>, DOMNodeList)
SFXList<SFXXMLNodePtr> の別名です。リストに格納されたノード間には順序関係があります。
// 解析対象の XML 文書( apple.xml )
<fruit>
<name>apple</name>
<size>XS</size>
<color>red</color>
</fruit>
SFCError error; // エラー値 SFXXMLDOMParser parser; // DOM パーサー SFXAnsiString resultString; // 要素のテキストを格納する変数 // XML 文書 "apple.xml" を解析する if ((error = parser.Parse("/apple.xml")) == SFERR_NO_ERROR) { // DOM ツリーのルートノードを取得する SFXXMLDocumentPtr root = parser.GetDocument(); // XML 文書のルート要素(DOM ツリーのルートノードの最初の子ノード。この場合、fruit 要素)を取得する SFXXMLNodePtr child = root->GetFirstChild(); // fruit 要素のすべての子要素(子ノード)を取得する SFXXMLNode::DOMNodeListPtr nodeList = child->GetChildNodes(); // イテレータを取得する SFXXMLNode::DOMNodeList::Iterator itor = nodeList->GetFirstIterator(); // fruit 要素のすべての子ノードのテキストを表示する while (itor.HasNext()) { // name 要素、size 要素、color 要素の順に取得する SFXXMLNodePtr node = itor.GetNext(); // ノードの名前を取得する resultString = node->GetNodeName(); // ノードのテキストを取得する resultString = node->GetText(); // ノードのテキストを表示する (例: name 要素の場合は "apple") TRACE("%s",resultString.GetCString()); } }
enum NodeType { ELEMENT_NODE = 1, ATTRIBUTE_NODE = 2, TEXT_NODE = 3, CDATA_SECTION_NODE = 4, ENTITY_REFERENCE_NODE = 5, ENTITY_NODE = 6, PROCESSING_INSTRUCTION_NODE = 7, COMMENT_NODE = 8, DOCUMENT_NODE = 9, DOCUMENT_TYPE_NODE = 10, DOCUMENT_FRAGMENT_NODE = 11, NOTATION_NODE = 12, UNKNOWN_NODE = -1 };
W3C DOM レベル 1 勧告 (Document Object Model Level 1 Specification) の NodeType の一覧に記載されている数値です。
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |