Home | History | Annotate | Download | only in xml
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef CORE_FXCRT_XML_CXML_ELEMENT_H_
      8 #define CORE_FXCRT_XML_CXML_ELEMENT_H_
      9 
     10 #include <memory>
     11 #include <utility>
     12 #include <vector>
     13 
     14 #include "core/fxcrt/xml/cxml_attritem.h"
     15 #include "core/fxcrt/xml/cxml_object.h"
     16 
     17 class CXML_Element : public CXML_Object {
     18  public:
     19   static std::unique_ptr<CXML_Element> Parse(const void* pBuffer, size_t size);
     20 
     21   CXML_Element(const CXML_Element* pParent,
     22                const ByteStringView& qSpace,
     23                const ByteStringView& tagname);
     24   ~CXML_Element() override;
     25 
     26   // CXML_Object:
     27   CXML_Element* AsElement() override;
     28   const CXML_Element* AsElement() const override;
     29 
     30   ByteString GetTagName() const;
     31   ByteString GetNamespaceURI(const ByteString& qName) const;
     32   const CXML_Element* GetParent() const { return m_pParent.Get(); }
     33   size_t CountAttrs() const { return m_AttrMap.size(); }
     34   void GetAttrByIndex(size_t index,
     35                       ByteString* space,
     36                       ByteString* name,
     37                       WideString* value) const;
     38   WideString GetAttrValue(const ByteStringView& name) const;
     39 
     40   int GetAttrInteger(const ByteStringView& name) const;
     41 
     42   void AppendChild(std::unique_ptr<CXML_Object> child) {
     43     m_Children.push_back(std::move(child));
     44   }
     45 
     46   size_t CountChildren() const { return m_Children.size(); }
     47   size_t CountElements(const ByteStringView& space,
     48                        const ByteStringView& tag) const;
     49   CXML_Object* GetChild(size_t index) const;
     50   CXML_Element* GetElement(const ByteStringView& space,
     51                            const ByteStringView& tag,
     52                            size_t nth) const;
     53 
     54   void SetAttribute(const ByteString& space,
     55                     const ByteString& name,
     56                     const WideString& value);
     57 
     58  private:
     59   static bool MatchesElement(const CXML_Element* pKid,
     60                              const ByteStringView& space,
     61                              const ByteStringView& tag);
     62 
     63   const WideString* Lookup(const ByteString& space,
     64                            const ByteString& name) const;
     65 
     66   UnownedPtr<const CXML_Element> const m_pParent;
     67   const ByteString m_QSpaceName;
     68   const ByteString m_TagName;
     69   std::vector<CXML_AttrItem> m_AttrMap;
     70   std::vector<std::unique_ptr<CXML_Object>> m_Children;
     71 };
     72 
     73 #endif  // CORE_FXCRT_XML_CXML_ELEMENT_H_
     74