hkXmlParser.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:6k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_BASE_XMLPARSER_H
  9. #define HK_BASE_XMLPARSER_H
  10. #include <Common/Base/Container/Array/hkObjectArray.h>
  11. #include <Common/Base/Container/Tree/hkTree.h>
  12. class hkIstream;
  13. class hkStreamReader;
  14. class hkLineNumberStreamReader;
  15. /// A class to parse and write a sensible subset of XML. 
  16. /// Three parsing methods are supported - a SAX-like interface
  17. /// using nextNode(), a DOM-like interface parse() and a pull
  18. /// based DOM interface expandNode().
  19. /// Note that whitespace is compressed to a single space and
  20. /// nodes containing only whitespace are discarded.
  21. class hkXmlParser : public hkReferencedObject
  22. {
  23. public:
  24. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SERIALIZE);
  25. /// Available node types.
  26. enum NodeType
  27. {
  28. INVALID,
  29. START_ELEMENT,
  30. END_ELEMENT,
  31. CHARACTERS,
  32. MAX_ID
  33. };
  34. /// XML name / attribute pair.
  35. struct Attribute
  36. {
  37. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_BASE, Attribute);
  38. hkString name;
  39. hkString value;
  40. };
  41. struct StartElement;
  42. struct EndElement;
  43. struct Characters;
  44. /// Base xml node type.
  45. struct Node : public hkReferencedObject
  46. {
  47. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_BASE);
  48. Node( NodeType t ) : type(t) { }
  49. /// Cast this to a StartElement if possible, otherwise return HK_NULL.
  50. inline StartElement* asStart();
  51. /// Cast this to an EndElement if possible, otherwise return HK_NULL.
  52. inline EndElement* asEnd();
  53. /// Cast to Characters if possible, otherwise return HK_NULL.
  54. inline Characters* asCharacters();
  55. NodeType type;
  56. };
  57. /// A start element node.
  58. struct StartElement : public Node
  59. {
  60. StartElement(const hkString& n) : Node(START_ELEMENT), name(n) { }
  61. /// Get the value of attribute a or d if not found.
  62. const char* getAttribute( const char* a, const char* d );
  63. hkString name;
  64. hkObjectArray<Attribute> attributes;
  65. };
  66. /// An end element node.
  67. struct EndElement : public Node
  68. {
  69. EndElement(const hkString& n) : Node(END_ELEMENT), name(n) { }
  70. hkString name;
  71. };
  72. /// Character data.
  73. struct Characters : public Node
  74. {
  75. Characters(const hkString& t) : Node(CHARACTERS), text(t) { }
  76. Characters(const char* s, int len) : Node(CHARACTERS), text(s,len) { }
  77. hkResult canonicalize(const char* killChars=HK_NULL);
  78. hkString text;
  79. };
  80. struct Tree : public hkTree<Node*>
  81. {
  82. Tree() : hkTree<Node*>(destroyXmlNode) {}
  83. static void HK_CALL destroyXmlNode(void* p)
  84. {
  85. Node* n = *static_cast<Node**>(p);
  86. delete n;
  87. }
  88. };
  89. public:
  90. /// Create a parser.
  91. hkXmlParser();
  92. /// Destroy a parser. Decrement a reference to its streamreader.
  93. ~hkXmlParser();
  94. /// Return the next node in the stream, or HK_NULL at the end.
  95. /// The caller should delete the node when done.
  96. virtual hkResult nextNode( Node** nodeOut, hkStreamReader* reader );
  97. /// Put a node back. A subsequent call to nextNode() will return 'node'.
  98. /// Multiple nodes may be put back and they will be returned in LIFO order.
  99. virtual void putBack( Node* node );
  100. /// Read a subtree up to the closing element of s into tree.
  101. /// Note that only the last node returned by nextNode() may be expanded.
  102. /// The tree is first clear()ed, and 's' is inserted as the root of
  103. /// the tree, followed by the subelements and the closing element
  104. /// matching 's'.
  105. virtual hkResult expandNode( StartElement* s, hkTree<Node*>& tree, hkStreamReader* reader );
  106. /// Parse the entire istream 'is' into a tree of xml elements.
  107. hkResult parse( hkTree<Node*>& tree, hkStreamReader* reader );
  108. /// Translate xml entities into their ascii values.
  109. /// dst and src may overlap since dst is always smaller than src.
  110. /// Returns new length of dst or -1 on error (unknown entity).
  111. static int translateEntities(char* dst, const char* src);
  112. /// Replace "spaceChars" with a single space then remove duplicate whitespace.
  113. /// dst and src may overlap since dst is always smaller than src.
  114. /// Returns new length of dst.
  115. static int canonicalize(char* dst, const char* src, const char* spaceChars=HK_NULL);
  116. /// Return a null terminated description of the last error.
  117. /// Call this after one of the parsing methods returns HK_FAILURE.
  118. const char* getLastError() const;
  119. protected:
  120. // <node/> is parsed as <node></node>, remember if a closing node is pending.
  121. hkArray<Node*> m_pendingNodes;
  122. //
  123. hkString m_lastError;
  124. };
  125. #include <Common/Serialize/Util/Xml/hkXmlParser.inl>
  126. #endif // HK_BASE_XMLPARSER_H
  127. /*
  128. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  129. * Confidential Information of Havok.  (C) Copyright 1999-2009
  130. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  131. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  132. * rights, and intellectual property rights in the Havok software remain in
  133. * Havok and/or its suppliers.
  134. * Use of this software for evaluation purposes is subject to and indicates
  135. * acceptance of the End User licence Agreement for this product. A copy of
  136. * the license is included with this software and is also available at www.havok.com/tryhavok.
  137. */