22#include <com/sun/star/xml/dom/DocumentBuilder.hpp>
23#include <com/sun/star/xml/sax/SAXException.hpp>
28using namespace css::lang;
29using namespace css::uno;
30using namespace css::xml::dom;
31using namespace css::xml::sax;
37 , m_aState( SAXDocumentBuilderState_READY)
42 return {
"com.sun.star.xml.dom.SAXDocumentBuilder" };
47 return "com.sun.star.comp.xml.dom.SAXDocumentBuilder";
69 m_aState = SAXDocumentBuilderState_READY;
76 if (
m_aState != SAXDocumentBuilderState_DOCUMENT_FINISHED)
86 if (
m_aState != SAXDocumentBuilderState_FRAGMENT_FINISHED)
97 if (
m_aState != SAXDocumentBuilderState_READY)
101 Reference< XDocumentFragment > aFragment =
m_aDocument->createDocumentFragment();
104 m_aState = SAXDocumentBuilderState_BUILDING_FRAGMENT;
112 if (
m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT)
116 if ( aNode->getNodeType() != NodeType_DOCUMENT_FRAGMENT_NODE)
119 m_aState = SAXDocumentBuilderState_FRAGMENT_FINISHED;
129 if (
m_aState != SAXDocumentBuilderState_READY)
130 throw SAXException();
132 Reference< XDocumentBuilder > aBuilder(DocumentBuilder::create(
m_xContext));
133 Reference< XDocument >
aDocument = aBuilder->newDocument();
136 m_aState = SAXDocumentBuilderState_BUILDING_DOCUMENT;
144 if (
m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT)
145 throw SAXException();
148 if ( aNode->getNodeType() != NodeType_DOCUMENT_NODE)
149 throw SAXException();
151 m_aState = SAXDocumentBuilderState_DOCUMENT_FINISHED;
159 if (
m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT &&
160 m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT)
161 throw SAXException();
163 Reference< XProcessingInstruction > aInstruction =
m_aDocument->createProcessingInstruction(
176 if (
m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT &&
177 m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT)
179 throw SAXException();
182 Reference< XElement > aElement;
183 const OUString& aPrefix(SvXMLImport::getNamespacePrefixFromToken(nElement,
nullptr));
184 const OUString& aURI( SvXMLImport::getNamespaceURIFromToken( nElement ) );
185 OUString aQualifiedName( SvXMLImport::getNameFromToken( nElement ) );
186 if( !aPrefix.isEmpty() )
187 aQualifiedName = aPrefix + SvXMLImport::aNamespaceSeparator + aQualifiedName;
189 if ( !aURI.isEmpty() )
193 aElement =
m_aDocument->createElementNS( aURI, aQualifiedName );
198 aElement =
m_aDocument->createElement( aQualifiedName );
200 aElement.set(
m_aNodeStack.top()->appendChild(aElement), UNO_QUERY);
212 if (
m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT &&
213 m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT)
215 throw SAXException();
218 Reference< XElement > aElement;
219 if ( !rNamespace.isEmpty() )
220 aElement =
m_aDocument->createElementNS( rNamespace, rName );
224 aElement.set(
m_aNodeStack.top()->appendChild(aElement), UNO_QUERY);
231 const Sequence< css::xml::Attribute > unknownAttribs = xAttribs->getUnknownAttributes();
232 for (
const auto& rUnknownAttrib : unknownAttribs )
234 const OUString& rAttrValue = rUnknownAttrib.Value;
235 const OUString& rAttrName = rUnknownAttrib.Name;
236 const OUString& rAttrNamespace = rUnknownAttrib.NamespaceURL;
237 if ( !rAttrNamespace.isEmpty() )
238 aElement->setAttributeNS( rAttrNamespace, rAttrName, rAttrValue );
240 aElement->setAttribute( rAttrName, rAttrValue );
248 sal_Int32 nAttrToken = it.getToken();
249 const OUString& aAttrPrefix(SvXMLImport::getNamespacePrefixFromToken(nAttrToken,
nullptr));
250 const OUString& aAttrURI( SvXMLImport::getNamespaceURIFromToken( nAttrToken ) );
251 OUString aAttrQualifiedName( SvXMLImport::getNameFromToken( nAttrToken ) );
252 if( !aAttrPrefix.isEmpty() )
253 aAttrQualifiedName = aAttrPrefix + SvXMLImport::aNamespaceSeparator + aAttrQualifiedName;
255 if ( !aAttrURI.isEmpty() )
256 aElement->setAttributeNS( aAttrURI, aAttrQualifiedName, it.toString() );
258 aElement->setAttribute( aAttrQualifiedName, it.toString() );
267 if (
m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT &&
268 m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT)
269 throw SAXException();
272 if (aNode->getNodeType() != NodeType_ELEMENT_NODE)
273 throw SAXException();
275 Reference< XElement > aElement(aNode, UNO_QUERY);
276 if( aElement->getPrefix() != SvXMLImport::getNamespacePrefixFromToken(nElement,
nullptr) ||
277 aElement->getTagName() != SvXMLImport::getNameFromToken( nElement ) )
278 throw SAXException();
290 if (
m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT &&
291 m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT)
292 throw SAXException();
295 if (aNode->getNodeType() != NodeType_ELEMENT_NODE)
296 throw SAXException();
298 Reference< XElement > aElement(aNode, UNO_QUERY);
300 const OUString& aPrefix = aElement->getPrefix();
301 if (!aPrefix.isEmpty())
302 aRefName = aPrefix + SvXMLImport::aNamespaceSeparator + aElement->getTagName();
304 aRefName = aElement->getTagName();
305 if (aRefName != rName)
306 throw SAXException();
328 if (
m_aState != SAXDocumentBuilderState_BUILDING_DOCUMENT &&
329 m_aState != SAXDocumentBuilderState_BUILDING_FRAGMENT)
330 throw SAXException();
332 Reference< XText > aText =
m_aDocument->createTextNode(rChars);
337extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
339 css::uno::XComponentContext* context , css::uno::Sequence<css::uno::Any>
const&)
Reference< XComponentContext > m_xContext
virtual void SAL_CALL endDocument() override
virtual void SAL_CALL startDocumentFragment(const css::uno::Reference< css::xml::dom::XDocument > &ownerDoc) override
virtual void SAL_CALL startUnknownElement(const OUString &Namespace, const OUString &Name, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
css::uno::Reference< css::xml::dom::XDocumentFragment > m_aFragment
virtual void SAL_CALL startFastElement(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
css::uno::Reference< css::xml::dom::XDocument > m_aDocument
virtual void SAL_CALL setDocumentLocator(const css::uno::Reference< css::xml::sax::XLocator > &xLocator) override
virtual void SAL_CALL endDocumentFragment() override
virtual void SAL_CALL reset() override
CSAXDocumentBuilder(const css::uno::Reference< css::uno::XComponentContext > &)
virtual css::uno::Reference< XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
virtual css::uno::Reference< css::xml::dom::XDocument > SAL_CALL getDocument() override
virtual void SAL_CALL startDocument() override
virtual void SAL_CALL processingInstruction(const OUString &rTarget, const OUString &rData) override
virtual void SAL_CALL endUnknownElement(const OUString &Namespace, const OUString &Name) override
virtual css::uno::Reference< XFastContextHandler > SAL_CALL createUnknownChildContext(const OUString &Namespace, const OUString &Name, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
virtual void SAL_CALL characters(const OUString &aChars) override
virtual css::xml::dom::SAXDocumentBuilderState SAL_CALL getState() override
const css::uno::Reference< css::uno::XComponentContext > m_xContext
std::stack< css::uno::Reference< css::xml::dom::XNode > > m_aNodeStack
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
css::xml::dom::SAXDocumentBuilderState m_aState
virtual css::uno::Reference< css::xml::dom::XDocumentFragment > SAL_CALL getDocumentFragment() override
static void setElementFastAttributes(const css::uno::Reference< css::xml::dom::XElement > &aElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttribs)
virtual OUString SAL_CALL getImplementationName() override
virtual void SAL_CALL endFastElement(sal_Int32 Element) override
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
FastAttributeList & castToFastAttributeList(const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * unoxml_CSAXDocumentBuilder_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)