TNB Library
TnbXmlAccessor.h
[詳解]
1#pragma once
11#include "TnbXml.h"
12#include "TnbAccessor.h"
13
14
15
16//T-TestCaseコードカバレッジDisable
17#pragma comment(user,"T-Coverage Disable")
18
19
20
21//TNB Library
22namespace TNB
23{
24
25
26
38{
39 DEFSUPER(CAbstractAccessor);
40 CXmlElement m_masterElement;
41 mutable CXmlElement m_element;
42 mutable CStr m_strSection;
43
49 bool m_SetSectionName(LPCTSTR lpszSectionName, bool isCreateMode) const
50 {
51 CStr sec = lpszSectionName;
52 sec.Replace('\\', '/');
53 if ( sec.IsEmpty() )
54 {
55 m_element = m_masterElement;
56 m_strSection.Empty();
57 }
58 else if ( m_strSection != sec )
59 {
60 if ( ! isCreateMode )
61 {
62 m_element = m_masterElement.SelectSingleNode(sec); //これで大丈夫か?
63 }
64 else
65 {
66 m_element = m_masterElement;
67 while ( ! sec.IsEmpty() )
68 {
69 CStr s;
70 INDEX idx = sec.Find('/');
71 if ( idx == INVALID_INDEX )
72 {
73 s = sec;
74 sec.Empty();
75 }
76 else
77 {
78 s = sec.Left(idx);
79 sec = sec.Mid(idx + 1);
80 }
81 bool find = false;
82 CXmlNodeList nlist = m_element.GetChildNodes();
83 loop ( i, nlist.GetLength() )
84 {
85 if ( nlist.GetNodeType(i) == MSXML::NODE_ELEMENT )
86 {
87 CXmlElement e = nlist.GetNode(i);
88 if ( e.GetNodeName() == s )
89 {
90 find = true;
91 m_element = e;
92 break;
93 }
94 }
95 }
96 if ( ! find )
97 {
98 m_element = m_element.AppendChildElement(s);
99 }
100 }
101 }
102 }
103 TRACE2( "master,current =[%s],[%s]\n", m_masterElement.GetElementFullPath(), m_element.GetElementFullPath() );
104 bool r = m_element.IsValid();
105 if ( ! r )
106 {
107 m_strSection.Empty();
108 }
109 return r;
110 }
111
112public:
113
115 CXmlAccessor(void) : m_masterElement(), m_strSection(_T("//"))
116 {
117 }
118
123 explicit CXmlAccessor(const CXmlElement& other)
124 : m_masterElement(other), m_strSection(_T("//"))
125 {
126 }
127
131 virtual ~CXmlAccessor(void)
132 {
133 m_element.Invalid();
134 m_masterElement.Invalid();
135 }
136
141 void SetBase(const CXmlElement& other)
142 {
143 m_masterElement = other;
144 m_strSection = _T("//");
145 }
146
151 virtual CStr GetTypeName(void) const
152 {
153 return _T("XML");
154 }
155
161 virtual bool Flush(void)
162 {
163 return true;
164 }
165
171 virtual CStrVector EnumSectionNames(LPCTSTR lpszSectionName = NULL) const
172 {
173 CStrVector vs;
174 if ( m_SetSectionName(lpszSectionName, false) )
175 {
176 CXmlNodeList nlist = m_element.GetChildNodes();
177 loop ( i, nlist.GetLength() )
178 {
179 if ( nlist.GetNodeType(i) == MSXML::NODE_ELEMENT )
180 {
181 CXmlElement e = nlist.GetNode(i);
182 vs.Add(e.GetNodeName());
183 }
184 }
185 }
186 return vs;
187 }
188
195 virtual bool DeleteSection(LPCTSTR lpszSectionName)
196 {
197 if ( m_SetSectionName(lpszSectionName, false) )
198 {
199 m_element.Remove();
200 return true;
201 }
202 return false;
203 }
204
211 virtual CStrVector EnumKeyNames(LPCTSTR lpszSectionName) const
212 {
213 CStrVector vs;
214 if ( m_SetSectionName(lpszSectionName, false) )
215 {
216 loop ( i, m_element.GetAttributeLength() )
217 {
218 CXmlAttribute a = m_element.GetAttribute(i);
219 if ( a.IsValid() )
220 {
221 vs.Add(a.GetName());
222 }
223 }
224 }
225 return vs;
226 }
227
234 virtual EKind GetKeyKind(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
235 {
236 EKind kind = EK_Nothing;
237 if ( m_SetSectionName(lpszSectionName, false) )
238 {
239 CXmlAttribute a = m_element.GetAttributeByName(lpszKey);
240 if ( a.IsValid() )
241 {
242 kind = EK_String;
243 }
244 }
245 return kind;
246 }
247
254 virtual CValue QueryValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
255 {
256 if ( m_SetSectionName(lpszSectionName, false) )
257 {
258 CXmlAttribute a = m_element.GetAttributeByName(lpszKey);
259 if ( a.IsValid() )
260 {
261 return CValue(a.GetValue());
262 }
263 }
264 return CValue();
265 }
266
275 virtual bool WriteValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey, const IAccessor::CValue& value)
276 {
277 bool r = false;
278 if ( value.GetKind() == EK_Nothing )
279 {
280 if ( m_SetSectionName(lpszSectionName, false) )
281 {
282 r = m_element.RemoveAttribute(lpszKey);
283 }
284 }
285 else
286 {
287 if ( m_SetSectionName(lpszSectionName, true) )
288 {
289 CXmlAttribute a = m_element.SetAttribute(lpszKey, value.QueryString());
290 r = a.IsValid();
291 }
292 }
293 return r;
294 }
295};
296
297
298
299}; // TNB
300
301
302
303//T-TestCaseコードカバレッジEnable
304#pragma comment(user,"T-Coverage Enable")
情報アクセス関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
XML関係のヘッダ
情報アクセス抽象クラス.
Definition: TnbAccessor.h:967
CStr GetElementFullPath(void) const
[作成] ルートからの Element名.
Definition: TnbXml.h:498
void Invalid(void)
[設定] 無効化.
Definition: TnbXml.h:429
bool IsValid(void) const
[確認] 有効確認.
Definition: TnbXml.h:421
void Remove(void)
[削除] 自分自身を削除.
Definition: TnbXml.h:465
CStr GetNodeName(void) const
[取得] 名前取得.
Definition: TnbXml.h:440
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
Definition: TnbStr.h:540
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
int Replace(TYP tOld, TYP tNew)
[処理] 文字置換.
Definition: TnbStr.h:1038
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
Definition: TnbStr.h:766
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
XMLアクセサークラス.
CXmlAccessor(const CXmlElement &other)
コンストラクタ
virtual ~CXmlAccessor(void)
デストラクタ
void SetBase(const CXmlElement &other)
[設定] 対象エレメント指定
virtual CStr GetTypeName(void) const
[取得] タイプ名取得
virtual bool Flush(void)
[操作] フラッシュ.
CXmlAccessor(void)
コンストラクタ
virtual CStrVector EnumKeyNames(LPCTSTR lpszSectionName) const
[取得] 名前一覧取得
virtual bool WriteValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey, const IAccessor::CValue &value)
[設定] 情報設定
virtual bool DeleteSection(LPCTSTR lpszSectionName)
[削除] 指定セクション削除
virtual CValue QueryValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
[取得] 情報取得
virtual EKind GetKeyKind(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
[取得] 情報取種取得
virtual CStrVector EnumSectionNames(LPCTSTR lpszSectionName=NULL) const
[取得] セクション名一覧取得
XML 属性管理クラス
Definition: TnbXml.h:293
bool IsValid(void) const
[確認] 有効確認.
Definition: TnbXml.h:312
CStr GetName(void) const
[取得] 名前取得.
Definition: TnbXml.h:332
CStr GetValue(void) const
[取得] 値取得.
Definition: TnbXml.h:342
XML Element ノード管理クラス
Definition: TnbXml.h:980
CXmlNode SelectSingleNode(LPCTSTR expression) const
[検索] 条件一致ノード検索.
Definition: TnbXml.h:1110
CXmlNodeList GetChildNodes(void) const
[取得] 子ノード群取得.
Definition: TnbXml.h:1088
CXmlElement AppendChildElement(LPCTSTR text)
[追加] Element 子ノード追加.
Definition: TnbXml.h:1166
XML ノードリスト管理クラス
Definition: TnbXml.h:76
size_t GetLength(void) const
[取得] 管理ノード数取得.
Definition: TnbXml.h:158
MSXML::DOMNodeType GetNodeType(INDEX index) const
[取得] ノードタイプ取得.
Definition: TnbXml.h:192
CXmlNodePtr GetNode(INDEX index) const
[取得] ノード取得.
Definition: TnbXml.h:169
CXmlAttribute GetAttributeByName(LPCTSTR name) const
[取得] 属性取得.
Definition: TnbXml.h:896
bool RemoveAttribute(LPCTSTR name)
[設定] 属性削除.
Definition: TnbXml.h:944
CXmlAttribute SetAttribute(LPCTSTR name, LPCTSTR value)
[設定] 属性設定.
Definition: TnbXml.h:925
CXmlAttribute GetAttribute(INDEX index) const
[取得] 属性取得.
Definition: TnbXml.h:881
long GetAttributeLength(void) const
[取得] 属性数取得.
Definition: TnbXml.h:866
情報アクセスの汎用値保持クラス.
Definition: TnbAccessor.h:100
CStr QueryString(void) const
[取得] 文字列情報取得
Definition: TnbAccessor.h:185
EKind GetKind(void) const
[取得] 情報取種取得
Definition: TnbAccessor.h:171
TNB Library
Definition: TnbDoxyTitle.txt:2
EKind
値型の種類.
Definition: TnbAccessor.h:80
@ EK_String
文字列
Definition: TnbAccessor.h:82
@ EK_Nothing
存在しない
Definition: TnbAccessor.h:81