Java SAXParser:`localName`和`qName`之间的区别

时间:2012-02-24 17:00:32

标签: java xml terminology sax

在Java中,Handler类包含名称为startElement的方法。此方法具有原型:

public void startElement(String uri, String localName, String qName, Attributes attributes)

我已阅读过Oracle Java网站,但我仍然不明白localNameqName参数之间有什么不同。他们解释一下:

  

localName - 本地名称(不带前缀)或空字符串if   未执行命名空间处理。       qName - 限定的XML 1.0名称(带前缀),如果限定名称不可用,则为空字符串。

在上面的定义中,我不知道一些概念:prefix(什么的前缀?)Namespace

有谁可以为我解释(尽可能简单)关于这些参数。

谢谢:)

4 个答案:

答案 0 :(得分:29)

作为一个例子,我将引用以下XML示例:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="from" type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

命名空间

命名空间是定义元素的逻辑容器。 XML Schema名称空间(使用uri:http://www.w3.org/2001/XMLSchema)。在上面的文档中,它在第2行引用.XML文档处理可以使用XML解析器进行,该解析器可以是名称空间感知的,但是使用名称空间的文档通常需要通过名称空间感知的解析器进行解析。

定义命名空间,以便a)它们可以被解析器和b)编目,以便不同命名空间中具有相同名称的元素可以存在于同一文档中,而不会被模糊定义。

前缀

前缀是用于引用命名空间的简写键。在上面的示例中,xs用于引用XML Schema命名空间。

本地名称(部分)

文档中的元素具有在命名空间中定义的名称。在上面的示例中,您可以找到schemaelementcomplexTypesequenceelement作为本地名称。如果文档中引用了多个名称空间,并且其中一个或多个名称空间定义了具有相同名称的元素,则本地名称可能不明确。

合格名称(qName)

限定名称由命名空间的前缀组成(可选地,某些实现可以使用命名空间uri),后跟:,后跟元素的本地名称。在上面的示例中,您可以找到xs:schemaxs:elementxs:complexTypexs:sequencexs:element作为限定名称。这些名称是明确的,可以由解析器处理并验证。

答案 1 :(得分:1)

Ryan的答案非常好。您需要的唯一其他信息是在SAX中的startElement事件上报告的内容的确切详细信息取决于SAX解析器的各种配置设置。可悲的是,我没有时间给出Ryan所做的细致细节。

答案 2 :(得分:1)

在sax解析器中有本地名称,qname和名称空间

qname是标签名称和名称空间,而本地名称只是标签名称。本地名称可能不明确,但qname永远不会。

答案 3 :(得分:0)

XML名称空间引入了

QNames Q ualified 名称),以便用作URI引用。 QName定义元素和属性的有效标识符。 QNames通常用于引用XML文档中的特定元素或属性,并提供用于简明地标识public MatchShipmentsToLocationsPage selectJustThisInvoiceRadioButton() { var applyOptions = _driver.FindElement(applyLocationForLocator); //var justThisInvoiceRadioButton = applyOptions.FindElement(By.Id()) //_driver.FindElement(justThisInvoiceRadioButtonLocator).Click(); //var allFutureShipmentsRadioButtonLocator = applyOptions.FindElement(By.Id("rbAllShipments")); //allFutureShipmentsRadioButtonLocator.Click(); var allships = applyOptions.FindElements(By.Name("locationGroup"))[1]; IJavaScriptExecutor js = (IJavaScriptExecutor)_driver; js.ExecuteScript("arguments[0].click()", allships); // allships.Click(); Thread.Sleep(5000); return this; } 对的机制。命名空间也可以在XML根元素

中声明

示例:

{URI, local-name}

QName <?xml version='1.0'?> <doc xmlns:x="http://example.com/ns/foo"> <x:p/> </doc> x:p{URI, local-name}的简明,明确的名称,其中{"http://example.com/ns/foo", "p"}.是本地名称。

Java类比:

doc