python解析xml

Python 有三种方法解析 XML:ElementTreeSAX 以及 DOM

使用 ElementTree 解析 xml

xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块。

ElementTree 和 Element 对象:

  • ElementTree: ElementTree 类是 XML 文档的树形表示。它包含一个或多个 Element 对象,代表整个 XML 文档。
  • Element: Element 对象是 XML 文档中元素的表示。每个元素都有一个标签、一组属性和零个或多个子元素。

ET.ElementTree()

ET.ElementTree()xml.etree.ElementTree 模块中的一个类,它用于创建一个 ElementTree 对象,这个对象可以包含一个完整的 XML 文档树结构。通过这个类,你可以方便地操作整个 XML 文档,包括解析、创建、修改和写入 XML 数据。

当你创建一个 ElementTree 对象时,你通常需要提供一个根元素(Root Element)作为参数。这个根元素是整个 XML 文档的顶级元素,所有的其他元素都会作为它的子元素存在。

以下是 ET.ElementTree() 类的一些常用方法:

  1. parse(): 解析一个 XML 文件或字符串,并返回一个 ElementTree 对象。
  2. write(): 将 ElementTree 对象写入到一个文件或文件对象中。
  3. find(): 在 ElementTree 对象中查找与指定路径或标签名匹配的元素。
  4. findall(): 在 ElementTree 对象中查找所有与指定路径或标签名匹配的元素。
import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element('bookstore')

# 创建子元素并添加到根元素
book = ET.SubElement(root, 'book', category='cooking', lang='en')
title = ET.SubElement(book, 'title', lang='en')
title.text = 'Everyday Italian'
author = ET.SubElement(book, 'author')
author.text = 'Giada De Laurentiis'

# 创建 ElementTree 对象
tree = ET.ElementTree(root)

# 写入到文件
tree.write('example.xml', encoding='utf-8', xml_declaration=True)

# 解析文件并获取 ElementTree 对象
new_tree = ET.parse('example.xml')
new_root = new_tree.getroot()

# 查找特定的元素
for book in new_root.findall('book'):
    print(f"Book Category: {book.attrib['category']}")
    print(f"Book Language: {book.attrib['lang']}")
    print(f"Book Title: {book.find('title').text}")
    print("-" * 40)

解析xml

fromstring()

fromstring() 函数是该模块提供的一个便捷方法,用于将包含 XML 数据的字符串解析为一个 Element 对象,这个对象是 XML 树结构中的一个节点。

fromstring() 函数特别有用,当你需要从一个 XML 格式的字符串直接创建一个 Element 对象时。这个函数属于 xml.etree.ElementTree 模块,它能够解析 XML 字符串并返回一个 Element 对象,你可以对这个对象进行进一步的操作,比如提取数据、修改 XML 结构等。

以下是一个使用 fromstring() 函数的示例:

import xml.etree.ElementTree as ET

# 假设我们有一个 XML 格式的字符串
xml_string = """

  
    Everyday Italian
    Giada De Laurentiis
    2005
    30.00
  
  
    Harry Potter
    J.K. Rowling
    2005
    29.99
  
  
    Learning XML
    Erik T. Ray
    2003
    39.95
  

"""

# 使用 fromstring() 方法将 XML 字符串解析为 Element 对象
root = ET.fromstring(xml_string)

# 打印解析后的 Element 对象的 tag 和 text
print(f"Tag: {root.tag}, Text: {root.text}")

# 可以通过遍历 Element 对象的子节点来访问 XML 数据
for child in root:
    print(f"Title: {child.find('title').text}")
    print(f"Author: {child.find('author').text}")
    print(f"Year: {child.find('year').text}")
    print(f"Price: {child.find('price').text}")
    print("-" * 40)

在这个例子中,首先定义了一个包含多个书籍信息的 XML 字符串。然后,使用 fromstring() 函数将这个字符串解析为一个 Element 对象。通过这个 Element 对象,我们可以访问 XML 文档中的各种信息,例如书名、作者、出版年份和价格。

parse()

parse() 函数是 xml.etree.ElementTree 模块中的另一个重要方法,它用于解析 XML 文件并返回一个 ElementTree 对象,该对象包含了整个 XML 文档的树形结构。与 fromstring() 方法不同parse() 方法用于从文件对象读取 XML 数据,而 fromstring() 则是用于从字符串读取 XML 数据。

使用 parse() 方法时,你需要提供一个打开的文件对象(例如,使用 open() 函数返回的对象),该文件对象包含 XML 数据。parse() 方法会读取文件内容,并构建出一个 ElementTree 对象,你可以使用这个对象来访问和操作 XML 文档的结构和数据。

以下是一个使用 parse() 方法的示例:

import xml.etree.ElementTree as ET

# 假设我们有一个名为 'example.xml' 的 XML 文件
# 文件内容与之前提供的 XML 字符串相同

# 使用 open() 函数以读取模式打开 XML 文件
with open('example.xml', 'r') as xml_file:
    # 使用 parse() 方法解析 XML 文件并返回 ElementTree 对象
    tree = ET.parse(xml_file)

    # 根元素可以通过 getroot() 方法获取
    root = tree.getroot()
    print(f"Root Element: {root.tag}")

    # 可以通过根元素来访问 XML 文档中的所有子元素
    for child in root:
        print(f"Book Title: {child.find('title').text}")
        print(f"Book Author: {child.find('author').text}")
        print(f"Book Year: {child.find('year').text}")
        print(f"Book Price: {child.find('price').text}")
        print("-" * 40)

在这个例子中,我们首先打开了一个名为 example.xml文件,该文件包含了 XML 数据。然后,我们使用 parse() 方法来解析这个文件,并获取到一个 ElementTree 对象。通过调用 getroot() 方法,我们可以获取到 XML 文档的根元素。之后,我们可以遍历根元素的子元素,提取出每本书的标题、作者、出版年份和价格等信息。

parse() 方法是处理存储在文件中的 XML 数据的有效方式,它允许你构建出一个完整的 XML 树形结构,从而可以方便地对整个 XML 文档进行解析和操作。

getroot()

getroot()xml.etree.ElementTree 模块中的一个方法,它用于获取解析后的 XML 文档的根元素。当你使用 parse() 函数从文件中解析 XML 数据时,它会返回一个 ElementTree 对象,该对象包含了整个 XML 文档的树形结构。通过这个 ElementTree 对象,你可以调用 getroot() 方法来访问 XML 文档的根节点

根节点是 XML 文档结构的最顶层元素,它包含了所有的子元素和数据。通过访问根节点,你可以开始遍历整个 XML 文档,查找特定的元素,提取数据或者对 XML 结构进行修改。

find() 

find() 用于在当前 Element 对象的子元素中查找与指定路径或标签名匹配的第一个元素。这个方法非常有用,当你需要在 XML 文档中定位到特定的元素并对其进行操作时。

find() 方法可以接受两个参数:

  1. path:这是一个字符串,表示从当前 Element 向下查找的 XPath 路径。XPath 是一种在 XML 和 HTML 文档中查找信息的语言。你可以使用标签名、属性和其他选择器来构建路径。
  2. namespaces:这是一个可选的字典,用于指定命名空间的前缀和 URI。如果你的 XML 文档使用了命名空间,你需要提供这个参数来正确解析路径。

find() 方法返回与指定路径或标签名匹配的第一个 Element 对象,如果没有找到匹配的元素,则返回 None

以下是一个使用 find() 方法的示例:

import xml.etree.ElementTree as ET

# 假设我们有一个名为 'example.xml' 的 XML 文件
# 文件内容如下:
'''

  
    Everyday Italian
    Giada De Laurentiis
  
  
    Harry Potter
    J.K. Rowling
  

'''

# 解析 XML 文件并获取根元素
root = ET.parse('example.xml').getroot()

# 使用 find() 方法查找第一个  元素
first_book = root.find('book')

# 打印找到的  元素的标题
title_element = first_book.find('title')
if title_element is not None:
    print(f"Book Title: {title_element.text}")

# 使用 XPath 路径查找特定的  元素
cooking_book = root.find('.//book[@category="cooking"]')

# 打印找到的烹饪类书籍的作者
if cooking_book is not None:
    author_element = cooking_book.find('author')
    if author_element is not None:
        print(f"Cooking Book Author: {author_element.text}")

在这个示例中,我们首先解析了一个名为 example.xml 的 XML 文件,并获取了根元素。然后,我们使用 find() 方法查找了第一个 元素,并打印出了它的标题。接着,我们使用了一个 XPath 路径来查找分类为 "cooking" 的书籍,并打印出了它的作者信息。

find() 方法是处理 XML 数据时的一个非常有用的工具,它允许你快速定位到 XML 文档中的特定元素,并对其进行操作。通过结合使用标签名和 XPath 路径,你可以灵活地在 XML 文档中导航和查询。

findall() 方法: 使用 findall() 方法可以查找具有指定标签的所有子元素:

attrib 属性

xml.etree.ElementTree 模块中,每个 Element 对象都有一个 attrib 属性,它是一个字典,用于存储与该元素关联的属性。属性通常以名称和值对的形式存在,名称是属性的名称,值是属性的值。这个属性在解析 XML 文档时特别有用,因为它允许你访问元素的属性,如类名、ID、样式等。

当你使用 xml.etree.ElementTree 模块解析一个 XML 文档时,所有的属性都会被读取并存储在 Element 对象的 attrib 属性中。你可以像访问普通字典一样访问 attrib 属性。

以下是一个使用 attrib 属性的示例:

import xml.etree.ElementTree as ET

# 假设我们有一个包含属性的 XML 字符串
xml_string = """

  
    Everyday Italian
    Giada De Laurentiis
  
  
    Harry Potter
    J.K. Rowling
  

"""

# 解析 XML 字符串并获取根元素
root = ET.fromstring(xml_string)

# 遍历根元素的所有  子元素
for book in root.findall('book'):
    # 打印每个  元素的属性
    print(f"Book Category: {book.attrib['category']}")
    print(f"Book Language: {book.attrib['lang']}")
    print("-" * 40)

在这个示例中,我们首先定义了一个包含两个 元素的 XML 字符串,每个元素都有 categorylang 属性。然后,我们使用 fromstring() 方法将这个字符串解析为一个 Element 对象,并获取根元素。接着,我们使用 findall() 方法找到所有的 子元素,并遍历它们。对于每个 元素,我们通过 attrib 属性访问并打印了它的 categorylang 属性。

text 属性

text 属性用于获取或设置与 Element 对象关联的文本内容。这个属性通常用于访问或修改元素内的纯文本数据。需要注意的是,text 属性可能包含空白字符,如空格、换行符和制表符等。

创建xml

Element() 

Element() 函数是 xml.etree.ElementTree 模块中的一个构造函数,用于创建一个新的 XML 元素(Element 对象)。这个函数通常用于构建 XML 文档的树结构,或者在已有的 XML 文档中添加新的元素节点

当你调用 Element() 函数时,你可以传递多个参数初始化 Element 对象:

  1. tag必需参数,表示元素的标签名。
  2. attrib:可选参数,一个字典,用于指定元素的属性
  3. *children:可选参数,可以是一个或多个子元素,用于构建元素的子节点结构。

创建 Element 对象后,你可以使用 attrib 属性来添加或修改元素的属性,使用 text 属性来设置或获取元素的文本内容,以及使用 append() 方法来添加子元素。

以下是一个使用 Element() 函数的示例:

import xml.etree.ElementTree as ET

# 创建一个新的根元素
root = ET.Element('bookstore')

# 创建一个新的  元素,并设置属性和文本内容
book = ET.Element('book', attrib={'category': 'cooking', 'lang': 'en'})
book.text = 'This is a cooking book.'

# 创建  和 <author> 子元素
title = ET.Element('title')
title.text = 'Everyday Italian'

author = ET.Element('author')
author.text = 'Giada De Laurentiis'

# 将子元素添加到 <book> 元素中
book.append(title)
book.append(author)

# 将 <book> 元素添加到根元素中
root.append(book)

# 打印构建的 XML 树结构
print(ET.tostring(root, encoding='unicode'))</code></pre> 
  <p>在这个示例中,首先创建了一个新的根元素 <code>bookstore</code>。然后,创建了一个新的 <code>book</code> 元素,并为其设置了属性和文本内容。接着,创建了 <code>title</code> 和 <code>author</code> 子元素,并将它们的文本内容分别设置为书籍的标题和作者。之后,将这些子元素添加到 <code>book</code> 元素中,然后将 <code>book</code> 元素添加到根元素 <code>bookstore</code> 中。最后,使用 <code>tostring()</code> 方法将构建的 XML 树结构转换为字符串并打印出来。</p> 
  <p></p> 
  <h4 style="background-color:transparent;"><code>SubElement()</code></h4> 
  <p><code>SubElement()</code> 函数用于在<strong>已存在的 XML 元素下创建一个新的子元素</strong>。这个方法是 <code>Element</code> 类的一个方法,可以通过调用已存在的元素的 <code>SubElement</code> 方法来使用。它简化了创建和添加子元素到 XML 树结构的过程。</p> 
  <p>当你调用 <code>SubElement()</code> 方法时,你需要提供以下参数:</p> 
  <ol> 
   <li><code>tag</code>:<strong>必需参数</strong>,表示要创建的子元素的标签名。</li> 
   <li><code>attrib</code>:可选参数,一个字典,用于指定子元素的属性。</li> 
  </ol> 
  <p><code>SubElement()</code> 方法会<strong>创建一个新的 <code>Element</code> 对象</strong>,并将其<strong>作为当前元素的子元素插入</strong>。这个方法也<strong>返回创建的 <code>Element</code> 对象</strong>,允许你对新创建的子元素进行进一步的操作,如设置文本内容或添加更多子元素。</p> 
  <p>以下是一个使用 <code>SubElement()</code> 方法的示例:</p> 
  <pre><code class="hljs">import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element('bookstore')

# 使用 SubElement() 方法创建一个新的 <book> 子元素
book = root.SubElement('book', category='cooking', lang='en')

# 为 <book> 元素创建 <title> 和 <author> 子元素
book.set('isbn', '1234567890')  # 设置属性的快捷方式
title = book.SubElement('title')
title.text = 'Everyday Italian'
author = book.SubElement('author')
author.text = 'Giada De Laurentiis'

# 打印构建的 XML 树结构
tree = ET.ElementTree(root)
print(ET.tostring(root, encoding='unicode', method='xml'))</code></pre> 
  <p>在这个示例中,我们首先创建了一个名为 <code>bookstore</code> 的根元素。然后,我们使用 <code>SubElement()</code> 方法为根元素创建了一个 <code><book></code> 子元素,并为其设置了 <code>category</code> 和 <code>lang</code> 属性。接着,我们为 <code><book></code> 元素创建了 <code><title></code> 和 <code><author></code> 子元素,并设置了它们的文本内容。我们还使用了 <code>set()</code> 方法来为 <code><book></code> 元素设置了一个 <code>isbn</code> 属性。最后,我们使用 <code>ElementTree()</code> 方法将根元素转换成一个 ElementTree 对象,并使用 <code>tostring()</code> 方法将 XML 树结构转换为字符串并打印出来。</p> 
  <h3 style="background-color:transparent;">修改xml</h3> 
  <p><strong>1.直接赋值</strong>:你可以直接通过元素的 <code>attrib</code> 属性来赋新值给已有的属性,或者添加新的属性。</p> 
  <pre><code class="hljs"># 假设我们有一个名为 element 的 Element 对象,并且它有一个名为 'att1' 的属性
element = ET.Element('example')
element.set('att1', 'value1')

# 修改属性值
element.attrib['att1'] = 'new_value'

# 添加新属性
element.attrib['att2'] = 'another_value'</code></pre> 
  <p><strong>2.使用 <code>set()</code> 方法</strong>:<code>Element</code> 对象的 <code>set()</code> 方法可以用来设置属性的值。这个方法允许你通过属性名和值作为参数来设置。</p> 
  <pre><code class="hljs"># 修改属性值
element.set('att1', 'updated_value')

# 添加新属性
element.set('att3', 'new_value')</code></pre> 
  <h3></h3> 
  <h3 style="background-color:transparent;">删除xml</h3> 
  <p>remove() 方法可以删除元素</p> 
  <pre><code class="hljs">root.remove(title_element)</code></pre> 
  <h3></h3> 
  <h3>练习</h3> 
  <p>创建文档,把文档保存到xml文件,再解析xml的实例</p> 
  <pre><code class="hljs">import xml.etree.ElementTree as ET

# 创建一个XML文档
root = ET.Element('bookstore')

# 添加第一本书
book1 = ET.SubElement(root, 'book')
title1 = ET.SubElement(book1, 'title')
title1.text = 'Introduction to Python'
author1 = ET.SubElement(book1, 'author')
author1.text = 'John Doe'
price1 = ET.SubElement(book1, 'price')
price1.text = '29.99'

# 添加第二本书
book2 = ET.SubElement(root, 'book')
title2 = ET.SubElement(book2, 'title')
title2.text = 'Data Science with Python'
author2 = ET.SubElement(book2, 'author')
author2.text = 'Jane Smith'
price2 = ET.SubElement(book2, 'price')
price2.text = '39.95'

# 将XML文档保存到文件
tree = ET.ElementTree(root)
tree.write('books.xml')

# 从文件中解析XML文档
parsed_tree = ET.parse('books.xml')
parsed_root = parsed_tree.getroot()

# 遍历XML树并打印书籍信息
for book in parsed_root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    price = book.find('price').text
    print(f'Title: {title}, Author: {author}, Price: {price}')</code></pre> 
  <p></p> 
  <h2>使用 SAX 解析 xml</h2> 
  <p>SAX(Simple API for XML)是一种<strong>基于事件</strong>的 XML 处理模型,它允许你<strong>逐个元素地访问</strong> XML 文档的内容,而<strong>不是一次性</strong>将整个文档加载到内存中。这种解析方式对于<strong>处理大型 XML 文件</strong>非常有用,因为它可以<strong>减少内存消耗</strong>并<strong>提高处理速度</strong>。</p> 
  <p>Python 通过 <code>xml.sax</code> 模块提供了对 SAX 解析的支持。以下是使用 <code>xml.sax</code> 进行 XML 解析的基本步骤:</p> 
  <ol> 
   <li> <p><strong>创建 SAX 解析器实例</strong>:你需要创建一个解析器对象,Python 支持两种解析器:<strong><code>xml.sax.make_parser()</code></strong> 可以创建一个基于纯 Python 的解析器,或者你可以指定一个外部解析器,如 <code>lxml.etree</code>。</p> </li> 
   <li> <p><strong>定义 SAX 事件处理器</strong>:你需要<strong>定义一个或多个事件处理器类</strong>,这些类继承自 <strong><code>xml.sax.handler.ContentHandler</code></strong> 并<strong>实现其方法</strong>,以<strong>处理 XML 文档中的不同事件</strong>,如开始元素、结束元素、字符数据等。</p> </li> 
   <li> <p><strong>注册事件处理器</strong>:将你的事件处理器<strong>注册</strong>到解析器中,这样当解析器遇到相应的事件时,就会调用处理器中的方法。</p> </li> 
   <li> <p><strong>解析 XML 文档</strong>:使用解析器对象的<strong> <code>parse()</code></strong> 方法来读取和解析 XML 文档。</p> </li> 
  </ol> 
  <p>以下是一个使用 <code>xml.sax</code> 进行 SAX 解析的示例:</p> 
  <pre><code class="hljs">import xml.sax
from xml.sax import handler

class MyContentHandler(handler.ContentHandler):
    def __init__(self):
        handler.ContentHandler.__init__(self)
        self.current_element = None

    def startElement(self, name, attrs):
        self.current_element = name
        print(f"Start Element: {name}")

    def endElement(self, name):
        print(f"End Element: {name}")

    def characters(self, content):
        if self.current_element and content.strip():
            print(f"Characters in {self.current_element}: {content}")

# 创建解析器实例
parser = xml.sax.make_parser()

# 注册事件处理器
parser.setContentHandler(MyContentHandler())

# 解析 XML 文件
parser.parse(r'C:\Users\Administrator\Desktop\文件夹\解析xml\example.xml')</code></pre> 
  <p>在这个示例中,我们首先定义了一个 <code>MyContentHandler</code> 类,它<strong>实现了 <code>ContentHandler</code> 的几个方法来处理不同的事件</strong>。然后,我们<strong>创建</strong>了一个<strong>解析器实例</strong>并将我们的<strong>事件处理器注册</strong>到<strong>它上面</strong>。最后,我们调用<strong> <code>parse()</code> 方法</strong>来<strong>解析</strong>一个名为 <code>example.xml</code> 的<strong>文件</strong>。</p> 
  <p>当你运行这个程序时,它会打印出 XML 文档中每个元素的开始和结束事件,以及元素内的字符数据(如果存在的话)。</p> 
  <p>SAX 解析是一种高效的处理 XML 的方式,特别是对于大型文件或流式数据,它可以帮助你在不过度消耗资源的情况下处理 XML 数据。</p> 
  <p></p> 
  <h3><code>ContentHandler</code> 类</h3> 
  <p><code>ContentHandler</code> 类是 Python <code>xml.sax</code> 模块中的<strong>一个接口</strong>,用于<strong>处理 SAX 解析器</strong>在解析 XML 文档时产生的<strong>事件</strong>。当使用 SAX 进行 XML 解析时,解析器<strong>会遍历整个文档</strong>,并在遇到文档的不同部分时<strong>触发事件</strong>,如遇到元素的开始、结束、字符数据等。<code>ContentHandler</code> 类定义了这些事件的处理器,你可以继承这个类并实现其中的方法来处理这些事件。</p> 
  <p>以下是 <code>ContentHandler</code> 类中定义的一些常用方法,你可以重写这些方法来处理解析事件:</p> 
  <ol> 
   <li><code>startDocument()</code>: 在文档开始解析时调用。</li> 
   <li><code>endDocument()</code>: 在文档解析结束时调用。</li> 
   <li><code>startElement()</code>: 在遇到元素的开始标签时调用,参数包括元素名和属性字典。</li> 
   <li><code>endElement()</code>: 在遇到元素的结束标签时调用,参数为元素名。</li> 
   <li><code>characters()</code>: 在遇到元素的字符数据时调用,参数为字符串。</li> 
  </ol> 
  <h3>make_parser()</h3> 
  <p>用于创建一个 SAX 解析器对象。这个对象是 SAX 解析流程的核心,负责读取 XML 数据并触发相应的事件。你可以通过配置这个解析器对象来指定如何处理 XML 文档中的不同事件,例如通过设置内容处理器(<code>ContentHandler</code>)来处理文档中的数据。</p> 
  <p></p> 
  <h3>setContentHandler()</h3> 
  <p>用于<strong>设置</strong>处理 SAX 解析事件的<strong>内容处理器</strong>。内容处理器是一个实现了 <code>xml.sax.ContentHandler</code> 接口的类实例,它定义了如何处理 XML 文档中的不同事件,如元素的开始、结束、字符数据等。</p> 
  <p>当你创建了一个自定义的内容处理器类并想要将其与 SAX 解析器关联时,你会使用 <code>setContentHandler()</code> 方法。这样,当解析器读取和解析 XML 文档时,它将调用内容处理器中的方法来处理相应的事件。</p> 
  <p></p> 
  <h3 style="background-color:transparent;"><code>parse()</code></h3> 
  <p><code>parse()</code>方法是<code>XMLReader</code>类的实例(通常称为解析器)的一个方法,用于<strong>开始整个XML文档的解析过程</strong>。当你调用这个方法时,它会<strong>触发一系列的事件</strong>,这些事件会通知你XML文档的结构和内容,包括元素的开始、结束、文本内容等。</p> 
  <p><code>parse()</code>方法可以接受两个参数:</p> 
  <ol> 
   <li> <p><strong>源(source)</strong>:这是一个可选参数,指定了要解析的XML数据的来源。它可以是一个文件路径字符串,一个打开的文件对象,或者一个<code>io.BytesIO</code>对象(如果你正在处理二进制数据)。如果省略这个参数,解析器会从标准输入读取数据。</p> </li> 
   <li> <p><strong>处理程序(handler)</strong>:这是另一个可选参数,指定了一个<code>ContentHandler</code>对象,用于接收和处理解析事件。如果你没有提供处理程序,或者提供了<code>None</code>,那么解析器将使用默认的处理程序,它实际上不会做任何事情。</p> </li> 
  </ol> 
  <p>练习:解析movies.xml</p> 
  <pre><code class="hljs">#!/usr/bin/python3

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # 元素开始调用
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print ("*****Movie*****")
         title = attributes["title"]
         print ("Title:", title)

   # 元素结束调用
   def endElement(self, tag):
      if self.CurrentData == "type":
         print ("Type:", self.type)
      elif self.CurrentData == "format":
         print ("Format:", self.format)
      elif self.CurrentData == "year":
         print ("Year:", self.year)
      elif self.CurrentData == "rating":
         print ("Rating:", self.rating)
      elif self.CurrentData == "stars":
         print ("Stars:", self.stars)
      elif self.CurrentData == "description":
         print ("Description:", self.description)
      self.CurrentData = ""

   # 读取字符时调用
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
  
if ( __name__ == "__main__"):
   
   # 创建一个 XMLReader
   parser = xml.sax.make_parser()
   # 关闭命名空间
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # 重写 ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("movies.xml")</code></pre> 
  <h3></h3> 
  <h2 style="background-color:transparent;">使用xml.dom解析xml</h2> 
  <p><code>xml.dom</code> 是 Python 标准库中的一个模块,它提供了一个 DOM(文档对象模型)接口来处理 XML 数据。DOM 将 XML 文档表示为一个树结构,其中<strong>每个节点</strong>都是 <strong><code>xml.dom.minidom.Node</code> 类的实例</strong>。使用 <code>xml.dom</code> 模块,你可以方便地访问和操作 XML 文档中的元素和属性。</p> 
  <p>以下是使用 <code>xml.dom.minidom</code> 解析 XML 的基本步骤:</p> 
  <ol> 
   <li>导入 <code>xml.dom.minidom</code> 模块。</li> 
   <li>使用 <code>parse()</code> 方法解析 XML 文件或字符串。</li> 
   <li>通过返回的 <code>Document</code> 对象访问和操作 XML 数据。</li> 
  </ol> 
  <pre><code class="hljs">from xml.dom import minidom

# 解析 XML 文件
def parse_xml_file(file_path):
    doc = minidom.parse(file_path)
    return doc

# 解析 XML 字符串
def parse_xml_string(xml_string):
    doc = minidom.fromstring(xml_string)
    return doc

# 假设我们有一个名为 'example.xml' 的 XML 文件
xml_file_path = 'example.xml'

# 解析文件并获取 Document 对象
doc = parse_xml_file(xml_file_path)

# 访问并打印文档的根元素
root = doc.documentElement
print(f"Root Element: {root.tagName}")

# 遍历根元素的子元素
for child in root.childNodes:
    print(f"Child Element: {child.tagName}, Content: {child.textContent}")</code></pre> 
  <p>在这个示例中,首先定义了两个函数,<code>parse_xml_file</code> 和 <code>parse_xml_string</code>,分别用于解析 XML 文件和字符串。然后使用 <code>minidom.parse()</code> 方法解析了一个名为 <code>example.xml</code> 的文件,并获取了 <code>Document</code> 对象。通过这个对象,可以访问 XML 文档的根元素,并遍历它的子元素。</p> 
  <p></p> 
  <h3><code>documentElement</code> 属性</h3> 
  <p>在 XML 文档对象模型(DOM)中,<code>documentElement</code> 属性是一个<strong> <code>Document</code> 对象的属性</strong>,它<strong>返回文档的根元素</strong>。在 XML 文档中,根元素是包含所有其他元素的最外层元素。通过 <code>documentElement</code> 属性,你可以快速访问 XML 文档的顶级元素,并从那里开始遍历或操作整个文档。</p> 
  <p>练习</p> 
  <pre><code class="hljs">#!/usr/bin/python3

from xml.dom.minidom import parse
import xml.dom.minidom

# 使用minidom解析器打开 XML 文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print ("Root element : %s" % collection.getAttribute("shelf"))

# 在集合中获取所有电影
movies = collection.getElementsByTagName("movie")

# 打印每部电影的详细信息
for movie in movies:
   print ("*****Movie*****")
   if movie.hasAttribute("title"):
      print ("Title: %s" % movie.getAttribute("title"))

   type = movie.getElementsByTagName('type')[0]
   print ("Type: %s" % type.childNodes[0].data)
   format = movie.getElementsByTagName('format')[0]
   print ("Format: %s" % format.childNodes[0].data)
   rating = movie.getElementsByTagName('rating')[0]
   print ("Rating: %s" % rating.childNodes[0].data)
   description = movie.getElementsByTagName('description')[0]
   print ("Description: %s" % description.childNodes[0].data)</code></pre> 
  <h3><code>hasAttribute()</code></h3> 
  <p><code>hasAttribute()</code> 方法是 DOM(文档对象模型)中 <code>Node</code> 接口的一部分,它用于检查一个元素是否具有指定的属性。这个方法在 <code>Element</code> 类中被实现,因为只有元素节点(<code>Element</code> 类的实例)可以拥有属性。</p> 
  <p>当你调用一个 <code>Element</code> 对象的 <code>hasAttribute()</code> 方法时,你需要传递一个字符串参数,该参数是你要检查的属性名。如果该元素具有该属性,<code>hasAttribute()</code> 方法返回 <code>True</code>;如果没有,返回 <code>False</code>。</p> 
  <h3><code>getAttribute()</code></h3> 
  <p><code>getAttribute</code> 方法是 DOM(文档对象模型)中 <code>Element</code> 接口的一部分,它用于<strong>获取指定属性的值</strong>。当你想要从一个元素节点中检索属性值时,可以使用这个方法。如果指定的属性<strong>存在</strong>于元素上,<code>getAttribute</code> 方法将<strong>返回该属性的值</strong>;如果属性不存在,则返回一个空字符串。</p> 
  <p>这个方法在 <code>Element</code> 类中被实现,因此只有元素节点(<code>Element</code> 类的实例)可以使用它。<code>getAttribute</code> 方法接受一个参数,即你要检索的属性名。</p> 
  <h3><code>getElementsByTagName()</code></h3> 
  <p><code>getElementsByTagName()</code> 方法是 DOM(文档对象模型)中 <code>Node</code> 接口的一部分,它<strong>用于从当前节点(或文档)中检索所有后代节点</strong>,这些后代节点的<strong>标签名</strong>与提供的<strong>参数匹配</strong>。这个方法返回一个包含所有匹配元素的<strong> <code>NodeList</code> 对象</strong>,你可以遍历这个列表来访问每个元素。</p> 
  <p>这个方法在 <code>Element</code> 类中特别有用,因为它允许你轻松地查询文档中的元素。<code>getElementsByTagName()</code> 方法<strong>接受一个参数</strong>,即你要<strong>搜索的标签名</strong>。这个方法对大小写不敏感,这意味着 "TAG" 和 "tag" 被认为是相同的标签名。</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1885370348799586304"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(xml)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1938913837885485056.htm"
                           title="微信小程序<rich-text>支持里面图片点击放大" target="_blank">微信小程序<rich-text>支持里面图片点击放大</a>
                        <span class="text-muted">二豆是富婆</span>
<a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a>
                        <div>使用渲染类似下面的html代码:宠物友好xxx提供宠物友好服务,具体请见下图wxml:js放大图片方法://富文本图片点击预览showImg(e){letcontentimg=e.target.dataset.nodes;letimgs=contentimg.match(/]+>/g);//把img所有节点的图片选择出来letarrImg=[];//遍历标签拼拿到你的图片的src里面的内容放在我们</div>
                    </li>
                    <li><a href="/article/1938817641108008960.htm"
                           title="uniappx 安卓app项目本地打包运行,腾讯地图报错:‘鉴权失败,请检查你的key‘" target="_blank">uniappx 安卓app项目本地打包运行,腾讯地图报错:‘鉴权失败,请检查你的key‘</a>
                        <span class="text-muted">夏木。。。</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/uniappx/1.htm">uniappx</a>
                        <div>根目录下添加AndroidManifest.xml文件,manifest.json文件中添加:"app":{"distribute":{"android":{"permissions":["",""],},"sdkConfigs":{"maps":{"qqmap":{"appkey_android":"腾讯地图key"}}}}},如此操作之后,重新自定义调试基座,运行模拟器,选择自定义基座:运行成</div>
                    </li>
                    <li><a href="/article/1938789142833983488.htm"
                           title="小程序领域H5的CSS布局优化" target="_blank">小程序领域H5的CSS布局优化</a>
                        <span class="text-muted">小程序开发2020</span>
<a class="tag" taget="_blank" href="/search/CS/1.htm">CS</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>小程序领域H5的CSS布局优化:从“乱屏”到“丝滑”的实战指南关键词:小程序布局优化、CSSFlex、CSSGrid、rpx适配、重排重绘优化摘要:本文从开发者最头疼的“小程序页面布局错乱”问题出发,结合小程序特有的运行环境(如rpx单位、组件限制),用“装修房子”的生活化比喻拆解CSS布局核心概念,系统讲解Flex/Grid布局的实战技巧、多端适配策略及性能优化方法。通过真实代码案例(含wxml</div>
                    </li>
                    <li><a href="/article/1938767838273662976.htm"
                           title="XSL-FO 块:深入解析与最佳实践" target="_blank">XSL-FO 块:深入解析与最佳实践</a>
                        <span class="text-muted">沐知全栈开发</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>XSL-FO块:深入解析与最佳实践概述XSL-FO(XSLFormattingObjects)是一种用于生成格式化文档的语言,它允许开发者将XML数据转换成PDF、HTML、PostScript等格式。在XSL-FO中,块(Block)是一个重要的概念,它定义了文档中的矩形区域,包括文本、图像、表格等。本文将深入解析XSL-FO块的相关知识,并分享一些最佳实践。XSL-FO块的定义与属性定义XSL</div>
                    </li>
                    <li><a href="/article/1938745405277794304.htm"
                           title="WPF 命名空间" target="_blank">WPF 命名空间</a>
                        <span class="text-muted">limonero</span>
<a class="tag" taget="_blank" href="/search/window/1.htm">window</a><a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a>
                        <div>1、项目默认创建之后会有一个本地的命名空间引入xmlns:local="clr-namespace:studywpf"2、引入命名空间的格式:xmlns:前缀="clr-namespace:命名空间"3、本地使用local前缀、如果使用系统的则使用sys前缀。引入示例之后就可以使用命名空间内的类创建对象和控件等等4、基本引入示例:10/11/201310/11/2013上例中:引入sys前缀的da</div>
                    </li>
                    <li><a href="/article/1938745278844694528.htm"
                           title="C#WPF的XAML命名空间和命名空间映射详解" target="_blank">C#WPF的XAML命名空间和命名空间映射详解</a>
                        <span class="text-muted">未来无限</span>
<a class="tag" taget="_blank" href="/search/C%23WPF%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/1.htm">C#WPF程序设计</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a><a class="tag" taget="_blank" href="/search/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4/1.htm">命名空间</a><a class="tag" taget="_blank" href="/search/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%A0%E5%B0%84/1.htm">命名空间映射</a><a class="tag" taget="_blank" href="/search/XAML/1.htm">XAML</a>
                        <div>本文详解C#WPF的XAML命名空间和命名空间映射。目录XAML命名空间定义实例演示命名空间说明XAML命名空间定义XAML命名空间实际上是XML命名空间概念的扩展。指定XAML命名空间的方法依赖于XML命名空间语法、将URI用作命名空间标识符以及使用前缀提供从相同标记源引用多个命名空间等约定。XML命名空间的XAML定义增添的主要概念是,XAML命名空间表示标记用法唯一性范围,还影响标记实体可如</div>
                    </li>
                    <li><a href="/article/1938743138193567744.htm"
                           title="Wpf之命名空间!" target="_blank">Wpf之命名空间!</a>
                        <span class="text-muted">weixin_44710358</span>
<a class="tag" taget="_blank" href="/search/Wpf/1.htm">Wpf</a><a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>文章目录前言一、命名空间二、命名空间讲解总结前言Wpf之命名空间!一、命名空间我们的程序中有许多的命名空间,例如一个程序中有Window类–Window类可能是指System.Windows.Window类,也可能是指位于第三方组件中的Window类,或您自己在应用程序中定义的Window类等。为了弄清你实际使用的是哪个类,XAML解析器会检查应用于元素的XML名称空间。二、命名空间讲解第一行代码</div>
                    </li>
                    <li><a href="/article/1938732926837518336.htm"
                           title="高通 audio pal 配置文件" target="_blank">高通 audio pal 配置文件</a>
                        <span class="text-muted">盼雨落,等风起</span>
<a class="tag" taget="_blank" href="/search/audio/1.htm">audio</a><a class="tag" taget="_blank" href="/search/%E9%9F%B3%E8%A7%86%E9%A2%91/1.htm">音视频</a>
                        <div>一、PAL配置文件解析1.mixer_paths.xml-硬件控制中枢核心作用:物理通路定义:建立Codec寄存器到音频端点的信号链路动态控制:运行时通过ALSAControlAPI(如amixerset"SpkrLeftPAVolume"25)实时调整参数平台适配:文件命名规则mixer_paths__.xml(如mixer_paths_sm8550-demo.xml)调试技巧:使用tinymi</div>
                    </li>
                    <li><a href="/article/1938716030180323328.htm"
                           title="基于SpringBoot实现MQTT消息收发" target="_blank">基于SpringBoot实现MQTT消息收发</a>
                        <span class="text-muted">萧雲漢</span>
<a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/iot/1.htm">iot</a>
                        <div>基于SpringBoot实现MQTT消息收发实验环境SpringBoot2.2.2.RELEASE:项目框架EMQXcommunitylatest:MQTT服务端Docker18.0.~:部署容器POM引入依赖包#pom.xmlorg.springframework.bootspring-boot-starter-integration2.2.2.RELEASEorg.springframewor</div>
                    </li>
                    <li><a href="/article/1938713636549750784.htm"
                           title="springboot mqtt收发消息" target="_blank">springboot mqtt收发消息</a>
                        <span class="text-muted">java知路</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                        <div>在SpringBoot中,可以使用MQTT协议来收发消息。以下是一个简单的示例:1.添加依赖在`pom.xml`文件中添加以下依赖:```xmlorg.springframework.integrationspring-integration-mqtt5.5.3```2.配置MQTT连接工厂在`application.properties`文件中添加以下配置:```propertiesspring</div>
                    </li>
                    <li><a href="/article/1938646088978329600.htm"
                           title="RabbitMQ是什么?以及优缺点" target="_blank">RabbitMQ是什么?以及优缺点</a>
                        <span class="text-muted">秋恬意</span>
<a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>核心概念要理解RabbitMQ,首先要掌握几个关键概念:生产者(Producer):发送消息的应用程序。它创建消息,并将其发送到RabbitMQ。消费者(Consumer):接收消息的应用程序。它连接到RabbitMQ,并订阅队列来获取消息。消息(Message):生产者发送并由消费者接收的数据块。消息可以包含任何信息,通常是JSON、XML或二进制数据。消息由消息头(包含元数据,如路由键、属性等</div>
                    </li>
                    <li><a href="/article/1938645962687836160.htm"
                           title="SpringBoot整合百度翻译API全攻略在Spring Boot项目的pom.xml文件中添加必要的依赖" target="_blank">SpringBoot整合百度翻译API全攻略在Spring Boot项目的pom.xml文件中添加必要的依赖</a>
                        <span class="text-muted">2501_92020556</span>
<a class="tag" taget="_blank" href="/search/dubbo/1.htm">dubbo</a>
                        <div>整合百度翻译API到SpringBoot项目注册百度翻译开发者账号在百度翻译开放平台(http://api.fanyi.baidu.com)注册账号,创建应用获取APIKey和SecretKey。这两个参数是调用翻译API的必要凭证。添加Maven依赖在SpringBoot项目的pom.xml文件中添加必要的依赖,包括HTTP客户端和JSON处理库:org.apache.httpcomponent</div>
                    </li>
                    <li><a href="/article/1938609401032142848.htm"
                           title="GDPU移动应用开发(安卓)期末考试复习资料" target="_blank">GDPU移动应用开发(安卓)期末考试复习资料</a>
                        <span class="text-muted"></span>

                        <div>第一部分一、选择题应用的基本构建块是:A.ActivityB.FragmentC.ServiceD.Intent答案:A.Activity下列哪个不是AndroidManifest.xml文件的主要用途?A.声明应用权限B.声明应用组件C.定义应用的图标和名称D.编写应用的业务逻辑答案:D.编写应用的业务逻辑在Android中、用于存储持久化数据的SQLite数据库、默认存储在哪个目录下?A./s</div>
                    </li>
                    <li><a href="/article/1938591370641993728.htm"
                           title="SVN迁移至git-避坑指南" target="_blank">SVN迁移至git-避坑指南</a>
                        <span class="text-muted">cityLight-dd</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/1.htm">版本控制</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/svn/1.htm">svn</a>
                        <div>获取历史开发人员名单主要是为了同步SVN历史提交记录到git进入到项目的svn根目录下,执行以下命令,可以获取到项目所有的历史提交人svnlog--xml|grep"^''{print$2}'|awk-F'''{print$1}'>userinfo.txt使用git下载SVN项目gitsvnclonesvn://127.0.0.1:33333/app/trunk/qct/JAVA/shinyway</div>
                    </li>
                    <li><a href="/article/1938521825365520384.htm"
                           title="写Mybatis没代码提示?试试这个插件!" target="_blank">写Mybatis没代码提示?试试这个插件!</a>
                        <span class="text-muted"></span>

                        <div>最强Mybatis代码提示插件——MybatisCodeHelperPro在写Mybatis的时候,XML经常没有代码提示,开发体验很差。最近发现了IntelliJ下的插件MybatisCodeHelperPro,写Mybatis代码时全程代码提示,非常方便!✨#{}语句智能提示,支持复杂类型写SQL时输入#{},插件会自动提示可用参数,支持对象属性的深度提示,极大减少拼写错误和查找参数的时间。✨</div>
                    </li>
                    <li><a href="/article/1938493550597566464.htm"
                           title="Maven项目实现简单发送邮件" target="_blank">Maven项目实现简单发送邮件</a>
                        <span class="text-muted">Coo~</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6/1.htm">发送邮件</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>Maven项目java后端实现发送邮件需求实现邮箱验证找回密码功能,本文介绍后端java实现实现pom.xml引入依赖包javax.mailmail1.4.7工具类SendMailUtilpackagecom.xxx.common.utils;importjava.io.FileOutputStream;importjava.io.OutputStream;importjava.text.Simp</div>
                    </li>
                    <li><a href="/article/1938453964743831552.htm"
                           title="Android杂谈(一):悬浮球" target="_blank">Android杂谈(一):悬浮球</a>
                        <span class="text-muted">人生游戏牛马NPC1号</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a>
                        <div>目录1.概述1.1什么是悬浮球(FloatingBall)1.1.1悬浮球的定义1.1.2悬浮球的基本概念1.1.3悬浮球的常见作用1.2悬浮球的应用场景与优势1.2.1悬浮球的常见应用场景1.2.2悬浮球带来的便利与优势悬浮球带来的便利与优势1.2.3设计建议1.3Android中悬浮球的实现方式简介2.悬浮球基础实现2.1创建悬浮球布局(XML设计)2.2悬浮球的显示与隐藏控制2.3悬浮球拖拽</div>
                    </li>
                    <li><a href="/article/1938438711024873472.htm"
                           title="员工列表查询-分页查询-PageHelper插件-注意事项" target="_blank">员工列表查询-分页查询-PageHelper插件-注意事项</a>
                        <span class="text-muted">还是鼠鼠</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>目录1.背景介绍2.Maven依赖(pom.xml)3.配置项(application.properties)4.核心代码示例4.1Controller层(Java)4.2Service层(Java)4.3Mapper接口(Java)4.4MapperXML(MyBatis)5.注意事项小结6.运行结果演示以下是一篇面向“JavaWeb使用PageHelper分页插件注意事项”简单介绍,包含完整可</div>
                    </li>
                    <li><a href="/article/1938422578012024832.htm"
                           title="第4篇:响应处理——返回数据给客户端(Gin文件下载,JSON,XML等返回)" target="_blank">第4篇:响应处理——返回数据给客户端(Gin文件下载,JSON,XML等返回)</a>
                        <span class="text-muted">GO兔</span>
<a class="tag" taget="_blank" href="/search/gin/1.htm">gin</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>引言:别让糟糕的响应毁了你的API新手开发者常犯的致命错误:只关注请求处理,却忽视了响应设计。一个功能正确但响应混乱的API,比功能有缺陷但响应清晰的API更令人沮丧。想象这个场景:客户端发送请求后,得到一个200状态码却包含错误信息的响应;或者需要解析嵌套三层的JSON才能获取核心数据;又或者面对没有任何错误提示的空白页面——这些都是响应处理不当导致的灾难。Gin提供了灵活而强大的响应处理机制,</div>
                    </li>
                    <li><a href="/article/1938377675341099008.htm"
                           title="com/fasterxml/jackson/datatype/jsr310/ser/ZoneIdSerializer" target="_blank">com/fasterxml/jackson/datatype/jsr310/ser/ZoneIdSerializer</a>
                        <span class="text-muted">鱼见千寻</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a>
                        <div>security引入jjwt的时候,突然爆出了com/fasterxml/jackson/datatype/jsr310/ser/ZoneIdSerializer这个错?????最后发现是jjwt引入的错误?????jjwt0.9.1跟spring系列2.3.7冲突,把这些spring.security.boot版本下降到2.2.2就行。</div>
                    </li>
                    <li><a href="/article/1938373385323081728.htm"
                           title="python xpath语法-Python Xpath语法" target="_blank">python xpath语法-Python Xpath语法</a>
                        <span class="text-muted">weixin_37988176</span>

                        <div>一、python数据提取xpath1.beautifulsoupxpath正则表达式2.xpath是一种在XML和HTML文档中查找信息的语言,可用来在XML和HTML中对元素进行遍历ChromeXPathHelper3.XPath语法(1)选取节点:使用路径表达式来选取文档中的节点nodename选取节点的所有子节点//div/如果是在最前面,代表从根节点选取,否则选择某节点下的某个节点一个/代</div>
                    </li>
                    <li><a href="/article/1938350704997494784.htm"
                           title="ROS系列(三):从零构建机器人通信系统 --- 包创建+发布订阅+Launch实战 & RViz/rqt可视化利器拆解!" target="_blank">ROS系列(三):从零构建机器人通信系统 --- 包创建+发布订阅+Launch实战 & RViz/rqt可视化利器拆解!</a>
                        <span class="text-muted"></span>

                        <div>引言机器人操作系统(ROS)的核心在于其模块化通信架构与高效的开发流程。本指南直击ROS开发的核心技术环节,助你快速构建功能节点并实现系统集成。你将从理解工作空间(catkin_ws)这一代码与编译的容器开始,掌握使用catkin_create_pkg创建功能包(Package)的方法,并深入关键配置文件CMakeLists.txt与package.xml的作用。核心在于编写节点(Node):通过</div>
                    </li>
                    <li><a href="/article/1938274175521189888.htm"
                           title="第⼀个与⼤模型交互的应⽤" target="_blank">第⼀个与⼤模型交互的应⽤</a>
                        <span class="text-muted">青春1314</span>
<a class="tag" taget="_blank" href="/search/A002/1.htm">A002</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/AI%E7%BC%96%E7%A8%8B/1.htm">AI编程</a>
                        <div>1、pom.xml依赖UTF-811110.35.0dev.langchain4jlangchain4j${langchain4j.version}dev.langchain4jlangchain4j-open-ai${langchain4j.version}org.tinylogtinylog-impl2.6.2org.tinylogslf4j-tinylog2.6.22、测试代码importd</div>
                    </li>
                    <li><a href="/article/1938255385794244608.htm"
                           title="足球数据API接口 - 【数据接口1】API调用示例代码" target="_blank">足球数据API接口 - 【数据接口1】API调用示例代码</a>
                        <span class="text-muted"></span>

                        <div>https://www.xxe.io/packagecom.huaying.demo.football;importjavax.xml.bind.JAXBContext;importjavax.xml.bind.Unmarshaller;importjavax.xml.bind.annotation.XmlElement;importjavax.xml.bind.annotation.XmlRoo</div>
                    </li>
                    <li><a href="/article/1938245674638307328.htm"
                           title="【MyBatis-Plus保姆级教程】第一章:从零到一,轻松掌握MyBatis-Plus基础与环境搭建(2025版)" target="_blank">【MyBatis-Plus保姆级教程】第一章:从零到一,轻松掌握MyBatis-Plus基础与环境搭建(2025版)</a>
                        <span class="text-muted">默语∿</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/mybatis-plus/1.htm">mybatis-plus</a>
                        <div>摘要:嗨,大家好,我是默语‍!今天我们要开启一个新的系列——《MyBatis-Plus保姆级教程》。作为一名Java开发者,如果你还在为繁琐的XML配置和重复的CRUD代码而烦恼,那么MyBatis-Plus(简称MP)绝对是你的救星!这篇文章是系列的第一篇,我会带你从零开始,深入理解MP的核心定位与技术优势,手把手教你如何搭建一个标准的开发环境,并完整演示在SpringBoot项目中集成MyBa</div>
                    </li>
                    <li><a href="/article/1938244918468210688.htm"
                           title="进阶版爬虫" target="_blank">进阶版爬虫</a>
                        <span class="text-muted">启明源码</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a>
                        <div>要掌握进阶版爬虫,你需要从基础爬虫技能过渡到更复杂的内容采集与反爬机制绕过技术。以下是一个系统性的进阶学习路线及关键技术点:进阶爬虫学习路线图一、基础回顾(必须扎实)熟练使用:requests/httpx网页解析:BeautifulSoup/lxml/xpath多线程/多进程:threading/multiprocessing/concurrent.futures简单爬虫项目:新闻/电商类页面爬取</div>
                    </li>
                    <li><a href="/article/1938216807546548224.htm"
                           title="XML读写数据-XPATH用法,快速定位元素" target="_blank">XML读写数据-XPATH用法,快速定位元素</a>
                        <span class="text-muted">专注VB编程开发20年</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                        <div>在XPath查询效率对比中,两种方式的性能差异如下:‌绝对路径方案‌/configuration/system.applicationHost/sites/site[@name='WebSite1']直接通过文档层级导航,避免全局扫描适合已知完整路径结构的场景,解析速度最快13‌相对路径方案‌(//site)[@name='"&siteName&"']/bindings/binding//运算符需</div>
                    </li>
                    <li><a href="/article/1938215545446920192.htm"
                           title="Java如何导出word(根据模板生成),通过word转成pdf,放压缩包" target="_blank">Java如何导出word(根据模板生成),通过word转成pdf,放压缩包</a>
                        <span class="text-muted">R-sz</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/pdf/1.htm">pdf</a>
                        <div>com.deepoovepoi-tl1.10.0-betaorg.apache.poipoi4.1.2org.apache.poipoi-ooxml4.1.2org.apache.poipoi-scratchpad4.1.2com.documents4jdocuments4j-local1.0.3com.documents4jdocuments4j-transformer-msoffice-wor</div>
                    </li>
                    <li><a href="/article/1938215041476128768.htm"
                           title="java aspose.words_Aspose.Words for java 示例" target="_blank">java aspose.words_Aspose.Words for java 示例</a>
                        <span class="text-muted">PraiseSunMan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/aspose.words/1.htm">aspose.words</a>
                        <div>安装Aspose.Words.jdk16.jar到本地mavenrepository:mvninstall:install-file-Dfile=Aspose.Words.jdk16.jar-DgroupId=com.aspose-DartifactId=aspose-words-Dversion=13.9.0.0-Dpackaging=jarpom.xml文件中依赖:com.asposeaspo</div>
                    </li>
                    <li><a href="/article/1938183639896485888.htm"
                           title="crawl4ai实操7" target="_blank">crawl4ai实操7</a>
                        <span class="text-muted">人工智能我来了</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/1.htm">网络爬虫</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>importasyncioimporttimefromcrawl4aiimportCrawlerRunConfig,AsyncWebCrawler,CacheModefromcrawl4ai.content_scraping_strategyimportLXMLWebScrapingStrategyfromcrawl4ai.deep_crawlingimportBFSDeepCrawlStrate</div>
                    </li>
                                <li><a href="/article/25.htm"
                                       title="Java实现的简单双向Map,支持重复Value" target="_blank">Java实现的简单双向Map,支持重复Value</a>
                                    <span class="text-muted">superlxw1234</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8F%8C%E5%90%91map/1.htm">双向map</a>
                                    <div>关键字:Java双向Map、DualHashBidiMap 
  
  
有个需求,需要根据即时修改Map结构中的Value值,比如,将Map中所有value=V1的记录改成value=V2,key保持不变。 
  
数据量比较大,遍历Map性能太差,这就需要根据Value先找到Key,然后去修改。 
  
即:既要根据Key找Value,又要根据Value</div>
                                </li>
                                <li><a href="/article/152.htm"
                                       title="PL/SQL触发器基础及例子" target="_blank">PL/SQL触发器基础及例子</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/oracle%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">oracle数据库</a><a class="tag" taget="_blank" href="/search/%E8%A7%A6%E5%8F%91%E5%99%A8/1.htm">触发器</a><a class="tag" taget="_blank" href="/search/PL%2FSQL%E7%BC%96%E7%A8%8B/1.htm">PL/SQL编程</a>
                                    <div>  
触发器的简介; 
触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。触发器和过程函数类似 过程函数必须要调用, 
  
一个表中最多只能有12个触发器类型的,触发器和过程函数相似 触发器不需要调用直接执行,


 
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发</div>
                                </li>
                                <li><a href="/article/279.htm"
                                       title="[时空与探索]穿越时空的一些问题" target="_blank">[时空与探索]穿越时空的一些问题</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a>
                                    <div> 
      我们还没有进行过任何数学形式上的证明,仅仅是一个猜想..... 
 
      这个猜想就是; 任何有质量的物体(哪怕只有一微克)都不可能穿越时空,该物体强行穿越时空的时候,物体的质量会与时空粒子产生反应,物体会变成暗物质,也就是说,任何物体穿越时空会变成暗物质..(暗物质就我的理</div>
                                </li>
                                <li><a href="/article/406.htm"
                                       title="easy ui datagrid上移下移一行" target="_blank">easy ui datagrid上移下移一行</a>
                                    <span class="text-muted">商人shang</span>
<a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E4%B8%8A%E7%A7%BB%E4%B8%8B%E7%A7%BB/1.htm">上移下移</a><a class="tag" taget="_blank" href="/search/easyui/1.htm">easyui</a><a class="tag" taget="_blank" href="/search/datagrid/1.htm">datagrid</a>
                                    <div>/**
 * 向上移动一行
 * 
 * @param dg
 * @param row
 */
function moveupRow(dg, row) {
	var datagrid = $(dg);
	var index = datagrid.datagrid("getRowIndex", row);
	if (isFirstRow(dg, row)) {</div>
                                </li>
                                <li><a href="/article/533.htm"
                                       title="Java反射" target="_blank">Java反射</a>
                                    <span class="text-muted">oloz</span>
<a class="tag" taget="_blank" href="/search/%E5%8F%8D%E5%B0%84/1.htm">反射</a>
                                    <div>本人菜鸟,今天恰好有时间,写写博客,总结复习一下java反射方面的知识,欢迎大家探讨交流学习指教 
 
首先看看java中的Class 
 
package demo;

public class ClassTest {
	
	/*先了解java中的Class*/
	
	public static void main(String[] args) {
		
    //任何一个类都</div>
                                </li>
                                <li><a href="/article/660.htm"
                                       title="springMVC 使用JSR-303 Validation验证" target="_blank">springMVC 使用JSR-303 Validation验证</a>
                                    <span class="text-muted">杨白白</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a>
                                    <div>JSR-303是一个数据验证的规范,但是spring并没有对其进行实现,Hibernate Validator是实现了这一规范的,通过此这个实现来讲SpringMVC对JSR-303的支持。 
 JSR-303的校验是基于注解的,首先要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。 
 
登录需要验证类 
 
public class Login {

	@NotEmpty</div>
                                </li>
                                <li><a href="/article/787.htm"
                                       title="log4j" target="_blank">log4j</a>
                                    <span class="text-muted">香水浓</span>
<a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a>
                                    <div>
log4j.rootCategory=DEBUG, STDOUT, DAILYFILE, HTML, DATABASE
#log4j.rootCategory=DEBUG, STDOUT, DAILYFILE, ROLLINGFILE, HTML

#console
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4</div>
                                </li>
                                <li><a href="/article/914.htm"
                                       title="使用ajax和history.pushState无刷新改变页面URL" target="_blank">使用ajax和history.pushState无刷新改变页面URL</a>
                                    <span class="text-muted">agevs</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a>
                                    <div>表现 
如果你使用chrome或者firefox等浏览器访问本博客、github.com、plus.google.com等网站时,细心的你会发现页面之间的点击是通过ajax异步请求的,同时页面的URL发生了了改变。并且能够很好的支持浏览器前进和后退。 
是什么有这么强大的功能呢? 
HTML5里引用了新的API,history.pushState和history.replaceState,就是通过</div>
                                </li>
                                <li><a href="/article/1041.htm"
                                       title="centos中文乱码" target="_blank">centos中文乱码</a>
                                    <span class="text-muted">AILIKES</span>
<a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/OS/1.htm">OS</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a>
                                    <div>一、CentOS系统访问 g.cn ,发现中文乱码。 
于是用以前的方式:yum -y install fonts-chinese 
CentOS系统安装后,还是不能显示中文字体。我使用 gedit 编辑源码,其中文注释也为乱码。     
  
      
  
后来,终于找到以下方法可以解决,需要两个中文支持的包: 
fonts-chinese-3.02-12.</div>
                                </li>
                                <li><a href="/article/1168.htm"
                                       title="触发器" target="_blank">触发器</a>
                                    <span class="text-muted">baalwolf</span>
<a class="tag" taget="_blank" href="/search/%E8%A7%A6%E5%8F%91%E5%99%A8/1.htm">触发器</a>
                                    <div>触发器(trigger):监视某种情况,并触发某种操作。 
触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 
语法: 
create trigger triggerName 
after/before </div>
                                </li>
                                <li><a href="/article/1295.htm"
                                       title="JS正则表达式的i m g" target="_blank">JS正则表达式的i m g</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a>
                                    <div>        g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止。         i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写。         m:表示</div>
                                </li>
                                <li><a href="/article/1422.htm"
                                       title="HTML5模式和Hashbang模式" target="_blank">HTML5模式和Hashbang模式</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/Hashbang%E6%A8%A1%E5%BC%8F/1.htm">Hashbang模式</a><a class="tag" taget="_blank" href="/search/HTML5%E6%A8%A1%E5%BC%8F/1.htm">HTML5模式</a>
                                    <div>        我们可以用$locationProvider来配置$location服务(可以采用注入的方式,就像AngularJS中其他所有东西一样)。这里provider的两个参数很有意思,介绍如下。 
html5Mode 
        一个布尔值,标识$location服务是否运行在HTML5模式下。 
ha</div>
                                </li>
                                <li><a href="/article/1549.htm"
                                       title="[Maven学习笔记六]Maven生命周期" target="_blank">[Maven学习笔记六]Maven生命周期</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a>
                                    <div>从mvn test的输出开始说起 
  
当我们在user-core中执行mvn test时,执行的输出如下: 
  
/software/devsoftware/jdk1.7.0_55/bin/java -Dmaven.home=/software/devsoftware/apache-maven-3.2.1 -Dclassworlds.conf=/software/devs</div>
                                </li>
                                <li><a href="/article/1676.htm"
                                       title="【Hadoop七】基于Yarn的Hadoop Map Reduce容错" target="_blank">【Hadoop七】基于Yarn的Hadoop Map Reduce容错</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a>
                                    <div>运行于Yarn的Map Reduce作业,可能发生失败的点包括 
 
 Task Failure 
 Application Master Failure 
 Node Manager Failure 
 Resource Manager Failure 
 1. Task Failure 
任务执行过程中产生的异常和JVM的意外终止会汇报给Application Master。僵死的任务也会被A</div>
                                </li>
                                <li><a href="/article/1803.htm"
                                       title="记一次数据推送的异常解决端口解决" target="_blank">记一次数据推送的异常解决端口解决</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%B0%E4%B8%80%E6%AC%A1%E6%95%B0%E6%8D%AE%E6%8E%A8%E9%80%81%E7%9A%84%E5%BC%82%E5%B8%B8%E8%A7%A3%E5%86%B3/1.htm">记一次数据推送的异常解决</a>
                                    <div>   需求:从db获取数据然后推送到B 
        程序开发完成,上jboss,刚开始报了很多错,逐一解决,可最后显示连接不到数据库。机房的同事说可以ping 通。 
    自已画了个图,逐一排除,把linux 防火墙 和 setenforce 设置最低。 
   service iptables stop 
</div>
                                </li>
                                <li><a href="/article/1930.htm"
                                       title="巧用视错觉-UI更有趣" target="_blank">巧用视错觉-UI更有趣</a>
                                    <span class="text-muted">brotherlamp</span>
<a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/ui%E8%A7%86%E9%A2%91/1.htm">ui视频</a><a class="tag" taget="_blank" href="/search/ui%E6%95%99%E7%A8%8B/1.htm">ui教程</a><a class="tag" taget="_blank" href="/search/ui%E8%87%AA%E5%AD%A6/1.htm">ui自学</a><a class="tag" taget="_blank" href="/search/ui%E8%B5%84%E6%96%99/1.htm">ui资料</a>
                                    <div>我们每个人在生活中都曾感受过视错觉(optical illusion)的魅力。 
视错觉现象是双眼跟我们开的一个玩笑,而我们往往还心甘情愿地接受我们看到的假象。其实不止如此,视觉错现象的背后还有一个重要的科学原理——格式塔原理。 
格式塔原理解释了人们如何以视觉方式感觉物体,以及图像的结构,视角,大小等要素是如何影响我们的视觉的。 
在下面这篇文章中,我们首先会简单介绍一下格式塔原理中的基本概念,</div>
                                </li>
                                <li><a href="/article/2057.htm"
                                       title="线段树-poj1177-N个矩形求边长(离散化+扫描线)" target="_blank">线段树-poj1177-N个矩形求边长(离散化+扫描线)</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E6%AE%B5%E6%A0%91/1.htm">线段树</a>
                                    <div>package com.ljn.base;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/**
 * POJ 1177 (线段树+离散化+扫描线),题目链接为http://poj.org/problem?id=1177
</div>
                                </li>
                                <li><a href="/article/2184.htm"
                                       title="HTTP协议详解" target="_blank">HTTP协议详解</a>
                                    <span class="text-muted">chicony</span>
<a class="tag" taget="_blank" href="/search/http%E5%8D%8F%E8%AE%AE/1.htm">http协议</a>
                                    <div>引言                                 </div>
                                </li>
                                <li><a href="/article/2311.htm"
                                       title="Scala设计模式" target="_blank">Scala设计模式</a>
                                    <span class="text-muted">chenchao051</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a>
                                    <div>Scala设计模式 
        
       我的话: 在国外网站上看到一篇文章,里面详细描述了很多设计模式,并且用Java及Scala两种语言描述,清晰的让我们看到各种常规的设计模式,在Scala中是如何在语言特性层面直接支持的。基于文章很nice,我利用今天的空闲时间将其翻译,希望大家能一起学习,讨论。翻译</div>
                                </li>
                                <li><a href="/article/2438.htm"
                                       title="安装mysql" target="_blank">安装mysql</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85/1.htm">安装</a>
                                    <div>安装mysql 
  (1)删除linux上已经安装的mysql相关库信息。rpm  -e  xxxxxxx   --nodeps (强制删除) 
     执行命令rpm -qa |grep mysql 检查是否删除干净 
  (2)执行命令  rpm -i MySQL-server-5.5.31-2.el</div>
                                </li>
                                <li><a href="/article/2565.htm"
                                       title="HTTP状态码大全" target="_blank">HTTP状态码大全</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/http%E7%8A%B6%E6%80%81%E7%A0%81/1.htm">http状态码</a>
                                    <div>完整的 HTTP 1.1规范说明书来自于RFC 2616,你可以在http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b3Iub3JnLw%3D%3D在线查阅。HTTP 1.1的状态码被标记为新特性,因为许多浏览器只支持 HTTP 1.0。你应只把状态码发送给支持 HTTP 1.1的客户端,支持协议版本可以通过调用request</div>
                                </li>
                                <li><a href="/article/2692.htm"
                                       title="asihttprequest上传图片" target="_blank">asihttprequest上传图片</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/ASIHTTPRequest/1.htm">ASIHTTPRequest</a>
                                    <div>NSURL *url =@"yourURL";
    ASIFormDataRequest*currentRequest =[ASIFormDataRequest requestWithURL:url];
    [currentRequest setPostFormat:ASIMultipartFormDataPostFormat];[currentRequest se</div>
                                </li>
                                <li><a href="/article/2819.htm"
                                       title="C语言中,关键字static的作用" target="_blank">C语言中,关键字static的作用</a>
                                    <span class="text-muted">e200702084</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a>
                                    <div>在C语言中,关键字static有三个明显的作用: 
 
1)在函数体,局部的static变量。生存期为程序的整个生命周期,(它存活多长时间);作用域却在函数体内(它在什么地方能被访问(空间))。 
一个被声明为静态的变量在这一函数被调用过程中维持其值不变。因为它分配在静态存储区,函数调用结束后并不释放单元,但是在其它的作用域的无法访问。当再次调用这个函数时,这个局部的静态变量还存活,而且用在它的访</div>
                                </li>
                                <li><a href="/article/2946.htm"
                                       title="win7/8使用curl" target="_blank">win7/8使用curl</a>
                                    <span class="text-muted">geeksun</span>
<a class="tag" taget="_blank" href="/search/win7/1.htm">win7</a>
                                    <div>1.  WIN7/8下要使用curl,需要下载curl-7.20.0-win64-ssl-sspi.zip和Win64OpenSSL_Light-1_0_2d.exe。  下载地址:  
http://curl.haxx.se/download.html   请选择不带SSL的版本,否则还需要安装SSL的支持包       2.  可以给Windows增加c</div>
                                </li>
                                <li><a href="/article/3073.htm"
                                       title="Creating a Shared Repository; Users Sharing The Repository" target="_blank">Creating a Shared Repository; Users Sharing The Repository</a>
                                    <span class="text-muted">hongtoushizi</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                                    <div>转载自:  
http://www.gitguys.com/topics/creating-a-shared-repository-users-sharing-the-repository/  Commands discussed in this section: 
 
 git init –bare 
 git clone 
 git remote 
 git pull 
 git p</div>
                                </li>
                                <li><a href="/article/3200.htm"
                                       title="Java实现字符串反转的8种或9种方法" target="_blank">Java实现字符串反转的8种或9种方法</a>
                                    <span class="text-muted">Josh_Persistence</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%88%96%E5%8F%8D%E8%BD%AC/1.htm">异或反转</a><a class="tag" taget="_blank" href="/search/%E9%80%92%E5%BD%92%E5%8F%8D%E8%BD%AC/1.htm">递归反转</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%88%86%E4%BA%A4%E6%8D%A2%E5%8F%8D%E8%BD%AC/1.htm">二分交换反转</a><a class="tag" taget="_blank" href="/search/java%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8F%8D%E8%BD%AC/1.htm">java字符串反转</a><a class="tag" taget="_blank" href="/search/%E6%A0%88%E5%8F%8D%E8%BD%AC/1.htm">栈反转</a>
                                    <div>注:对于第7种使用异或的方式来实现字符串的反转,如果不太看得明白的,可以参照另一篇博客: 
http://josh-persistence.iteye.com/blog/2205768 
  
/**
 * 
 */
package com.wsheng.aggregator.algorithm.string;

import java.util.Stack;

/**
</div>
                                </li>
                                <li><a href="/article/3327.htm"
                                       title="代码实现任意容量倒水问题" target="_blank">代码实现任意容量倒水问题</a>
                                    <span class="text-muted">home198979</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%80%92%E6%B0%B4/1.htm">倒水</a>
                                    <div>形象化设计模式实战             HELLO!架构                     redis命令源码解析 
  
倒水问题:有两个杯子,一个A升,一个B升,水有无限多,现要求利用这两杯子装C</div>
                                </li>
                                <li><a href="/article/3454.htm"
                                       title="Druid datasource" target="_blank">Druid datasource</a>
                                    <span class="text-muted">zhb8015</span>
<a class="tag" taget="_blank" href="/search/druid/1.htm">druid</a>
                                    <div>推荐大家使用数据库连接池 DruidDataSource. http://code.alibabatech.com/wiki/display/Druid/DruidDataSource DruidDataSource经过阿里巴巴数百个应用一年多生产环境运行验证,稳定可靠。 它最重要的特点是:监控、扩展和性能。 下载和Maven配置看这里: http</div>
                                </li>
                                <li><a href="/article/3581.htm"
                                       title="两种启动监听器ApplicationListener和ServletContextListener" target="_blank">两种启动监听器ApplicationListener和ServletContextListener</a>
                                    <span class="text-muted">spjich</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a>
                                    <div>引言:有时候需要在项目初始化的时候进行一系列工作,比如初始化一个线程池,初始化配置文件,初始化缓存等等,这时候就需要用到启动监听器,下面分别介绍一下两种常用的项目启动监听器 
  
ServletContextListener  
特点: 依赖于sevlet容器,需要配置web.xml 
使用方法: 
public class StartListener implements </div>
                                </li>
                                <li><a href="/article/3708.htm"
                                       title="JavaScript Rounding Methods of the Math object" target="_blank">JavaScript Rounding Methods of the Math object</a>
                                    <span class="text-muted">何不笑</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a>
                                    <div>    The next group of methods has to do with rounding decimal values into integers. Three methods — Math.ceil(),  Math.floor(), and  Math.round() — handle rounding in differen</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>