QXmlStreamReader 类

QXmlStreamReader 类提供了一个快速的解析器,用于通过简单的流式 API 读取格式良好的 XML。 更多...

头文件 #include <QXmlStreamReader>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意:此类中所有函数都是可重入的。

公开类型

枚举Error { NoError, CustomError, NotWellFormedError, PrematureEndOfDocumentError, UnexpectedElementError }
枚举ReadElementTextBehaviour { ErrorOnUnexpectedElement, IncludeChildElements, SkipChildElements }
枚举TokenType { NoToken, Invalid, StartDocument, EndDocument, StartElement, …, ProcessingInstruction }

属性

公开函数

QXmlStreamReader()
QXmlStreamReader(QIODevice *device)
QXmlStreamReader(const QByteArray &data)
QXmlStreamReader(QAnyStringView data)
~QXmlStreamReader()
voidaddData(QAnyStringView data)
voidaddData(const QByteArray &data)
voidaddExtraNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &extraNamespaceDeclaration)
voidaddExtraNamespaceDeclarations(const QXmlStreamNamespaceDeclarations &extraNamespaceDeclarations)
boolatEnd() const
QXmlStreamAttributesattributes() const
qint64characterOffset() const
voidclear()
qint64columnNumber() const
QIODevice *device() const
QStringViewdocumentEncoding() const
QStringViewdocumentVersion() const
QStringViewdtdName() const
QStringViewdtdPublicId() const
QStringViewdtdSystemId() const
QXmlStreamEntityDeclarationsentityDeclarations() const
intentityExpansionLimit() const
QXmlStreamEntityResolver *entityResolver() const
QXmlStreamReader::Error错误() const
QString错误字符串() const
boolhasError() const
(自6.6起) boolhasStandaloneDeclaration() const
boolisCDATA() const
boolisCharacters() const
boolisComment() const
boolisDTD() const
boolisEndDocument() const
boolisEndElement() const
boolisEntityReference() const
boolisProcessingInstruction() const
boolisStandaloneDocument() const
boolisStartDocument() const
boolisStartElement() const
boolisWhitespace() const
qint64lineNumber() const
QStringViewname() const
QXmlStreamNamespaceDeclarationsnamespaceDeclarations() const
boolnamespaceProcessing() const
QStringViewnamespaceUri() const
QXmlStreamNotationDeclarationsnotationDeclarations() const
QStringViewprefix() const
QStringViewprocessingInstructionData() const
QStringViewprocessingInstructionTarget() const
QStringViewqualifiedName() const
voidraiseError(const QString &message = QString())
QStringreadElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement)
QXmlStreamReader::TokenTypereadNext()
boolreadNextStartElement()
voidsetDevice(QIODevice *device)
voidsetEntityExpansionLimit(int limit)
voidsetEntityResolver(QXmlStreamEntityResolver *resolver)
voidsetNamespaceProcessing(bool)
voidskipCurrentElement()
QStringViewtext() const
QStringtokenString() const
QXmlStreamReader::TokenTypetokenType() const

详细说明

QXmlStreamReader提供了一种简单的流式API来解析格式良好的XML。它是首先将完整的XML加载到一个DOM树(参见QDomDocument)的一个替代方案。QXmlStreamReader可以从QIODevice(参见setDevice())读取数据,或从原始的QByteArray加载(参见addData())。

Qt为写入XML提供了QXmlStreamWriter

文本读取器的基本概念是报告XML文档作为标记流的格式,类似于SAX。QXmlStreamReader与SAX之间的主要区别在于报告XML标记的方式。在使用SAX的情况下,应用程序必须提供处理程序(回调函数),这些处理程序在解析器的方便时接收所谓的XML 事件。在使用QXmlStreamReader的情况下,应用程序代码本身驱动循环并从读取器中依次提取标记,就像它需要它们一样。这是通过调用readNext()来完成的,读取器从这个输入流中读取,直到完成下一个标记,此时它会返回tokenType()().然后可以使用包括isStartElement()和text()在内的一系列方便的函数来检查标记,以获取有关已经读取的信息。这种拉取方法的优点是,可以构建递归下降解析器,这意味着您可以将XML解析代码轻松地分成不同的方法或类。这使得在解析XML时跟踪应用程序的自身状态变得容易。

使用QXmlStreamReader的一个典型循环如下所示

  QXmlStreamReader xml;
  ...
  while (!xml.atEnd()) {
        xml.readNext();
        ... // do processing
  }
  if (xml.hasError()) {
        ... // do error handling
  }

QXmlStreamReader是一个符合XML 1.0规范的解析器,它不包含外部解析实体。只要没有错误发生,应用程序代码可以确信,

  • 由流读取器提供的数据满足W3C对符合规范XML的准则,
  • 标记提供在一个有效的顺序中。

除非QXmlStreamReader引发错误,否则它保证以下内容

  • 所有标签都是嵌套和正确关闭的。
  • 对内部实体的引用已替换为正确的替换文本。
  • 根据DTD的内部分集对属性进行了归一化或添加。
  • 类型为StartDocument的标记发生在所有其他标记之前,除了注释和进程指令之外。
  • 最多有一个DOCTYPE元素(类型为DTD的标记)存在。
  • 如果有,DOCTYPE元素出现在所有其他元素之前,除了StartDocument、注释和进程指令。

特别是,一旦看到任何类型为StartElementEndElementCharactersEntityReferenceEndDocument的标记,就不会再看到类型为StartDocument或DTD的标记。如果在输入流中存在顺序错误的标记,则会引发错误。

注意: 标记类型CommentProcessingInstruction可以出现在流的任何位置。

如果在解析过程中发生错误,atEnd()和hasError()返回true,并且error()返回出现的错误。函数errorString()、lineNumber()、columnNumber()和characterOffset()用于构造适当的错误或警告信息。为了简化应用程序代码,QXmlStreamReader包含一个raiseError()机制,允许您引发自定义错误,这将触发上述所述的错误处理。

QXmlStream Bookmarks Example演示了如何使用递归下降技术使用流读取器读取XML书签文件(XBEL)。

命名空间

QXmlStream可以理解和解析XML命名空间。例如,在StartElement的情况下,namespaceUri()返回元素的命名空间,而name()返回元素的本名称。命名空间URI和名称的组合唯一地标识一个元素。如果被解析器解析的XML实体中没有声明命名空间前缀,那么namespaceUri是空的。

如果您解析符合XML规范的XML数据,这些数据不使用命名空间,或不使用命名空间,可以使用元素的qualifiedName()来代替。一个限定名是元素的prefix()后跟冒号,然后是元素的本名称——正好就像元素在原始XML数据中出现的样。由于命名空间URI映射到前缀既不是唯一的,也不是通用的,对于那些符合命名空间规范的XML数据,应避免使用qualifiedName()。

为了解析使用未声明的命名空间前缀的独立文档,您可以关闭命名空间处理功能,即使用namespaceProcessing属性。

增量解析

QXmlStreamReader是一个增量解析器。它可以处理文档不能一次性解析的情况,因为这些数据是分块到达的(例如,来自多个文件或通过网络连接)。当读取器在完整解析文档之前的任何时刻耗尽了数据,它会报告一个PrematureEndOfDocumentError错误。当有更多数据到来时,无论是通过调用addData(),还是因为通过网络device()可用的更多数据,读取器会从PrematureEndOfDocumentError错误中恢复过来,并在下一次调用readNext()时继续解析新数据。

例如,如果您使用网络访问管理器QNetworkAccessManager从网络读取数据,您会对管理器进行网络请求,并收到网络响应。因为QNetworkReply是一个QIODevice,您会把它的readyRead()信号连接到一个自定义槽,例如在QNetworkAccessManager的讨论中展示的代码片段中的slotReadyRead()。在这个槽中,您使用readAll()读取所有可用数据,并使用addData()将其传递给XML流读取器。然后您调用您自定义的解析函数,它从读取器中读取XML事件。

性能和内存消耗

QXmlStreamReader在设计中就注重节省内存,因为它不会将整个XML文档树存储在内存中,而只存储报告时的当前标记。此外,QXmlStreamReader避免了通常映射XML文档到便于使用的Qt API所需的许多小的字符串分配。它是通过将所有字符串数据报告为QStringView而不是真正的QString对象来实现的。在这些对象上调用toString()会返回等效的真实QString对象。

成员类型文档

enum QXmlStreamReader::Error

这个枚举指定了不同的错误情况

常量描述
QXmlStreamReader::NoError0没有发生错误。
QXmlStreamReader::CustomError2使用raiseError()抛出了一个自定义错误
QXmlStreamReader::NotWellFormedError3解析器由于读取的XML不是良好格式,从而内部抛出了错误。
QXmlStreamReader::PrematureEndOfDocumentError4在解析良好格式的XML文档之前,输入流已经结束。如果流入更多XML数据,可以通过调用addData()或等待它通过device()到达,从该错误中恢复。
QXmlStreamReader::UnexpectedElementError1解析器遇到一个与预期不同的元素或标记。

enum QXmlStreamReader::ReadElementTextBehaviour

此枚举指定了readElementText()的不同行为。

常量描述
QXmlStreamReader::ErrorOnUnexpectedElement0当遇到子元素时,抛出一个UnexpectedElementError并返回迄今为止读取的内容。
QXmlStreamReader::IncludeChildElements1递归包含子元素的文本。
QXmlStreamReader::SkipChildElements2跳过子元素。

enum QXmlStreamReader::TokenType

此枚举指定了读取器刚刚读取的标记类型。

常量描述
QXmlStreamReader::NoToken0读取器尚未读取内容。
QXmlStreamReader::Invalid1发生错误,在error()和errorString()中报告。
QXmlStreamReader::StartDocument2读取器在documentVersion()中报告XML版本号,以及在XML文档中指定的编码documentEncoding()。如果文档声明为独立,isStandaloneDocument()返回true;否则返回false
QXmlStreamReader::EndDocument3读取器报告文档的结束。
QXmlStreamReader::StartElement4读取器报告元素的开始,其中包含namespaceUri()和name()。空元素也报告为StartElement,直接由EndElement跟随。可以通过调用便利函数readElementText()来连接直到相应EndElement的所有内容。属性在attributes()中报告,命名空间声明在namespaceDeclarations()中。
QXmlStreamReader::EndElement5读取器报告元素的结束,其中包含namespaceUri()和name()。
QXmlStreamReader::Characters6读取器在text()中报告字符。如果所有字符都是空白字符,isWhitespace()返回true。如果字符来自CDATA部分,isCDATA()返回true
QXmlStreamReader::Comment7读取器在text()中报告注释。
QXmlStreamReader::DTD8读取器在text()中报告DTD,符号声明在notationDeclarations()中,实体声明在entityDeclarations()中。DTD声明的详细信息在dtdName(),dtdPublicId()和dtdSystemId()中报告。
QXmlStreamReader::EntityReference9读者报告了一个无法解析的实体引用。引用的名称在name()中报告,替换文本在text()中。
QXmlStreamReader::ProcessingInstruction10阅读器在processingInstructionTarget()和processingInstructionData()中报告了一个处理指令。

属性文档

命名空间处理:bool

此属性包含流阅读器的命名空间处理标志。

此属性控制流阅读器是否处理命名空间。如果启用,则阅读器会处理命名空间,否则不会。

默认情况下,命名空间处理是启用的。

访问函数

boolnamespaceProcessing() const
voidsetNamespaceProcessing(bool)

成员函数文档

QXmlStreamReader::QXmlStreamReader()

构建流阅读器。

另请参阅setDevice()和addData

[显式] QXmlStreamReader::QXmlStreamReader(QIODevice *device)

创建一个新的流阅读器,从中读取设备

另请参阅setDevice()和clear

[显式] QXmlStreamReader::QXmlStreamReader(const QByteArray &data)

这是一个重载函数。

创建一个新的流阅读器,从中读取数据

另请参阅addData()、clearsetDevice

[显式] QXmlStreamReader::QXmlStreamReader(QAnyStringView data)

创建一个新的流阅读器,从中读取数据

注意:在Qt版本6.5之前的版本中,此构造函数为QStringconst char*重载。

另请参阅addData()、clearsetDevice

[非异常抛出] QXmlStreamReader::~QXmlStreamReader()

销毁阅读器。

void QXmlStreamReader::addData(QAnyStringView data)

为阅读器添加更多数据以供读取。如果阅读器有一个设备,则此函数不做任何事。

注意:在Qt版本6.5之前的版本中,此函数为QStringconst char*重载。

另请参阅readNext()和clear

void QXmlStreamReader::addData(const QByteArray &data)

这是一个重载函数。

为阅读器添加更多数据以供读取。如果阅读器有一个设备,则此函数不做任何事。

另请参阅readNext()和clear

void QXmlStreamReader::addExtraNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &extraNamespaceDeclaration)

添加一个额外的命名空间声明。该声明对当前元素的子元素有效,或者如果是函数在读取任何元素之前被调用,则对整个XML文档有效。

另请参阅 namespaceDeclarations()、addExtraNamespaceDeclarations() 和 setNamespaceProcessing()。

void QXmlStreamReader::addExtraNamespaceDeclarations(const QXmlStreamNamespaceDeclarations &extraNamespaceDeclarations)

添加由 extraNamespaceDeclarations 指定的声明向量。

另请参阅 namespaceDeclarations() 和 addExtraNamespaceDeclaration()。

bool QXmlStreamReader::atEnd() const

如果读取器已读取到 XML 文档的末尾,或者发生错误并且读取已中止,则返回 true。否则,它返回 false

当 atEnd() 和 hasError() 返回 true,且 error() 返回 PrematureEndOfDocumentError 时,这意味着 XML 到目前为止已正确形成,但没有完整解析到完整的 XML 文档。如果从 QByteArray 读取 XML,则可以使用 addData() 添加更多的 XML 数据块。如果从 QIODevice 读取 XML,则需要等待更多数据到达。无论如何,在可用更多数据时,atEnd() 會再次返回 false。

另请参阅 hasError()、error()、device() 和 QIODevice::atEnd

QXmlStreamAttributes QXmlStreamReader::attributes() const

返回 StartElement 的属性。

qint64 QXmlStreamReader::characterOffset() const

返回当前的字符偏移量,从 0 开始。

另请参阅 lineNumber() 和 columnNumber()。

void QXmlStreamReader::clear()

从读取器中删除任何 device() 或数据,并将其内部状态重置到初始状态。

另请参阅 addData()。

qint64 QXmlStreamReader::columnNumber() const

返回当前列号,从 0 开始。

另请参阅 lineNumber() 和 characterOffset()。

QIODevice *QXmlStreamReader::device() const

返回与 QXmlStreamReader 关联的当前设备,如果没有分配设备,则返回 nullptr

另请参阅 setDevice()。

QStringView QXmlStreamReader::documentEncoding() const

如果tokenType()为StartDocument,则该函数返回XML声明中指定的编码字符串。否则返回空字符串。

QStringView QXmlStreamReader::documentVersion() const

如果tokenType()为StartDocument,则该函数返回XML声明中指定的版本字符串。否则返回空字符串。

QStringView QXmlStreamReader::dtdName() const

如果tokenType()为DTD,则该函数返回DTD的名称。否则返回空字符串。

QStringView QXmlStreamReader::dtdPublicId() const

如果tokenType()为DTD,则该函数返回DTD的公共标识符。否则返回空字符串。

QStringView QXmlStreamReader::dtdSystemId() const

如果tokenType()为DTD,则该函数返回DTD的系统标识符。否则返回空字符串。

QXmlStreamEntityDeclarations QXmlStreamReader::entityDeclarations() const

如果tokenType()为DTD,则该函数返回DTD的未解析(外部)实体声明。否则返回空向量。

QXmlStreamEntityDeclarations类被定义为QListQXmlStreamEntityDeclaration的集合。

int QXmlStreamReader::entityExpansionLimit() const

返回单个实体允许扩展的最大字符数。如果一个实体扩展超过了给定的限制,则文档被认为不是良好的格式。

另请参阅setEntityExpansionLimit

QXmlStreamEntityResolver *QXmlStreamReader::entityResolver() const

返回实体解析器,如果没有实体解析器,则返回nullptr

另请参阅setEntityResolver

QXmlStreamReader::Error QXmlStreamReader::error() const

返回当前错误的类型,如果没有错误发生,则返回NoError

另请参阅errorString()和raiseError

QString QXmlStreamReader::errorString() const

返回通过raiseError设置的错误消息。

另请参阅errorlineNumbercolumnNumbercharacterOffset

bool QXmlStreamReader::hasError() const

如果发生错误,则返回 true,否则返回 false

另请参阅errorString() 和 error()。

[自 6.6 版起] bool QXmlStreamReader::hasStandaloneDeclaration() const

如果此文档有显式的独立声明(可以是 'yes' 或 'no'),则返回 true;否则返回 false

如果没有解析 XML 声明,此函数返回 false

该功能自 Qt 6.6 版开始引入。

另请参阅isStandaloneDocument()。

bool QXmlStreamReader::isCDATA() const

如果读取器报告来自 CDATA 部分的字符,则返回 true;否则返回 false

另请参阅isCharacters() 和 text()。

bool QXmlStreamReader::isCharacters() const

如果 tokenType() 等于 Characters,则返回 true;否则返回 false

另请参阅isWhitespace() 和 isCDATA()。

bool QXmlStreamReader::isComment() const

如果 tokenType() 等于 Comment,则返回 true;否则返回 false

bool QXmlStreamReader::isDTD() const

如果 tokenType() 等于 DTD,则返回 true;否则返回 false

bool QXmlStreamReader::isEndDocument() const

如果 tokenType() 等于 EndDocument,则返回 true;否则返回 false

bool QXmlStreamReader::isEndElement() const

如果 tokenType() 等于 EndElement,则返回 true;否则返回 false

bool QXmlStreamReader::isEntityReference() const

如果 tokenType() 等于 EntityReference,则返回 true;否则返回 false

bool QXmlStreamReader::isProcessingInstruction() const

如果 tokenType() 等于 ProcessingInstruction,则返回 true;否则返回 false

bool QXmlStreamReader::isStandaloneDocument() const

如果此文档在 XML 声明中已声明为独立,则返回 true;否则返回 false

如果没有解析 XML 声明,此函数返回 false

另请参阅hasStandaloneDeclaration

bool QXmlStreamReader::isStartDocument() const

如果 tokenType() 等于 StartDocument,则返回 true;否则返回 false

bool QXmlStreamReader>::isStartElement() const

如果 tokenType() 等于 StartElement,则返回 true;否则返回 false

bool QXmlStreamReader>::isWhitespace() const

如果读取器报告的字符只包含空白字符,则返回 true;否则返回 false

另请参阅isCharacters() 和 text()。

qint64 QXmlStreamReader>::lineNumber() const

返回当前行号,从1开始。

另请参阅columnNumber() 和 characterOffset

QStringView QXmlStreamReader>::name() const

返回 StartElementEndElementEntityReference 的本地名称。

另请参阅namespaceUri() 和 qualifiedName

QXmlStreamNamespaceDeclarations QXmlStreamReader>::namespaceDeclarations() const

如果 tokenType() 是 StartElement,则此函数返回元素的命名空间声明。否则返回一个空向量。

QXmlStreamNamespaceDeclarations 类定义为一个 QList,其中包含 QXmlStreamNamespaceDeclaration

另请参阅addExtraNamespaceDeclaration() 和 addExtraNamespaceDeclarations

QStringView QXmlStreamReader>::namespaceUri() const

返回 StartElementEndElement 的 namespaceUri。

另请参阅name() 和 qualifiedName

QXmlStreamNotationDeclarations QXmlStreamReader>::notationDeclarations() const

如果 tokenType() 是 DTD,则此函数返回 DTD 的 notation 声明。否则返回一个空向量。

QXmlStreamNotationDeclarations 类定义为一个 QList,其中包含 QXmlStreamNotationDeclaration

QStringView QXmlStreamReader>::prefix() const

返回 StartElementEndElement 的前缀。

另请参阅name() 和 qualifiedName

QStringView QXmlStreamReader>::processingInstructionData() const

返回 ProcessingInstruction 的数据。

QStringView QXmlStreamReader::processingInstructionTarget() const

返回处理指令的目标。

QStringView QXmlStreamReader::qualifiedName() const

返回起始元素或结束元素的有效名称。

有效名称是XML数据中元素的原生名称。它由命名空间前缀、冒号以及元素的局部名称组成。由于命名空间前缀不是唯一的(相同的前缀可以指向不同的命名空间,不同的前缀可以指向相同的命名空间),你不应该使用qualifiedName(),而是使用已解析的namespaceUri()以及属性的局部name()。

另请参阅 name(),prefix()以及namespaceUri()。

void QXmlStreamReader::raiseError(const QString &message = QString())

引发带有可选错误消息的自定义错误。

另请参阅 error()和errorString()。

QString QXmlStreamReader::readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement)

这是一个便利函数,在读取到的元素为起始元素时调用。读取到对应的结束元素并返回两者之间的所有文本。如果没有错误,则调用此函数后的当前标记(见tokenType())是结束元素。

在读取到CharactersEntityReference标记时,此函数将text()拼接在一起,但会跳过ProcessingInstructionComment。如果当前标记不是StartElement,则返回空字符串。

behaviour定义在读取到EndElement之前读取到任何其他内容时会发生什么。函数可以包含子元素的文本(例如,对于HTML很有用),忽略子元素或引发UnexpectedElementError并返回迄今为止读取的内容(默认)。

QXmlStreamReader::TokenType QXmlStreamReader::readNext()

读取下一个标记并返回其类型。

除了一个例外,一旦readNext()报告了错误,就不可能继续读取XML流。然后atEnd()返回truehasError()返回true,并且此函数返回QXmlStreamReader::Invalid

异常出现在当error()()返回PrematureEndOfDocumentError时。此错误在遇到一个格式正确但不是完整XML文档的XML片段的末尾时报告。在这种情况下,可以通过调用addData()()来恢复解析,向流中添加下一个XML片段,或者等待更多数据到达,当流来自QByteArray或者从device()读取时。

另请参阅tokenType()和tokenString

bool QXmlStreamReader::readNextStartElement()

读取直到当前元素内的下一个起始元素。当达到起始元素时返回true。当遇到元素结束或发生错误时返回false。

当前元素是与最近解析的起始元素匹配的元素,但没有达到匹配的结束元素。当解析器达到结束元素时,当前元素变为父元素。

这是一个方便函数,当您只关心解析XML元素时使用。在QXmlStream Bookmarks示例中广泛使用了此函数。

另请参阅readNext

void QXmlStreamReader::setDevice(QIODevice *device)

设置当前设备为device。设置设备会将流重置为其初始状态。

另请参阅device()和clear()。

void QXmlStreamReader::setEntityExpansionLimit(int limit)

设置单个实体允许扩展的最大字符数为limit。如果一个实体超出给定限制,该文档将不被视为格式正确。

这个限制是为了防止在加载未知XML文档时遭受DoS攻击,因为递归实体扩展可能会导致耗尽所有可用内存。

此属性的默认值是4096个字符。

另请参阅entityExpansionLimit

void QXmlStreamReader::setEntityResolver(QXmlStreamEntityResolver *resolver)

使resolver成为新的entityResolver

流读取器不会获取解析器的所有权。确保解析器在整个流读取器对象的生命周期内有效,或者直到设置另一个解析器或nullptr是调用者的责任。

另请参阅entityResolver

void QXmlStreamReader::skipCurrentElement()

读取直到当前元素的末尾,跳过任何子节点。此函数对于跳过未知元素很有用。

当前元素是与最近解析的起始元素匹配的元素,但没有达到匹配的结束元素。当解析器达到结束元素时,当前元素变为父元素。

QStringView QXmlStreamReader::text() const

返回CharactersCommentDTDEntityReference的文本。

QString QXmlStreamReader::tokenString() const

返回当前标记的字符串表示。

参见tokenType

QXmlStreamReader::TokenType QXmlStreamReader::tokenType() const

返回当前标记的类型。

您还可以使用以下便利函数查询当前标记:isStartDocument(),isEndDocument(),isStartElement(),isEndElement(),isCharacters(),isComment(),isDTD(),isEntityReference(),以及 isProcessingInstruction()。

参见tokenString

© 2024 The Qt Company Ltd. 本文档的贡献属于其各自的版权所有。提供的文档受 GNU自由文档许可证1.3版本 的条款约束,由自由软件基金会发布。Qt及其相应的标志是芬兰以及其他国家/地区的The Qt Company Ltd.的商标。所有其他商标都是其各自所有者的财产。