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/1950230804957294592.htm"
                           title="SpringMVC执行流程(原理),通俗易懂" target="_blank">SpringMVC执行流程(原理),通俗易懂</a>
                        <span class="text-muted">国服冰</span>
<a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><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>SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提</div>
                    </li>
                    <li><a href="/article/1950163724190937088.htm"
                           title="Spring Boot 2整合Druid的两种方式" target="_blank">Spring Boot 2整合Druid的两种方式</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/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Druid/1.htm">Druid</a>
                        <div>一、自定义整合Druid(非Starter方式)适用于需要完全手动控制配置的场景添加依赖(pom.xml)com.alibabadruid1.2.8org.springframework.bootspring-boot-starter-jdbc创建配置类@ConfigurationpublicclassDruidConfig{@Bean@ConfigurationProperties(prefix</div>
                    </li>
                    <li><a href="/article/1950058716040589312.htm"
                           title="在一个存在的包里面编写msg消息文件" target="_blank">在一个存在的包里面编写msg消息文件</a>
                        <span class="text-muted">CrimsonEmber</span>
<a class="tag" taget="_blank" href="/search/ROS%E7%AC%94%E8%AE%B0/1.htm">ROS笔记</a><a class="tag" taget="_blank" href="/search/ROS2/1.htm">ROS2</a>
                        <div>前言尽管最佳实践是在专门的接口包中声明接口,但有时在同一个包中完成接口的声明、创建和使用会更为便捷。创建文件创建好msg/AddressBook.msg文件,在你的包的目录下package.xmlrosidl_default_generatorsrosidl_default_runtimerosidl_interface_packagesCMakeList找到生成消息代码的包find_packag</div>
                    </li>
                    <li><a href="/article/1950047365528350720.htm"
                           title="百旺金赋航天金税发票清单接口软件使用指南" target="_blank">百旺金赋航天金税发票清单接口软件使用指南</a>
                        <span class="text-muted"></span>

                        <div>本文还有配套的精品资源,点击获取简介:《百旺金赋航天金税发票清单接口软件详解与核心组件解析》详细介绍了该软件的便捷性和功能,它能将Excel销售清单转换成XML格式,简化发票开具流程。该软件通过动态链接库(DLL)文件实现高效数据转换,并支持与金税系统的对接,提升企业财务效率并确保数据安全性。1.百旺金赋航天金税发票清单接口软件概述软件应用背景百旺金赋航天金税发票清单接口软件作为一种财务信息化工具</div>
                    </li>
                    <li><a href="/article/1950046229840850944.htm"
                           title="推客系统小程序机构版开发上线全攻略(2025年最新版)" target="_blank">推客系统小程序机构版开发上线全攻略(2025年最新版)</a>
                        <span class="text-muted">vx_qutudy</span>
<a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">推客小程序</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/1.htm">推客系统开发</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E5%AE%A2%E7%B3%BB%E7%BB%9F%E6%BA%90%E7%A0%81/1.htm">推客系统源码</a>
                        <div>一、开发前准备:筑牢基础,合规先行1.1注册与认证账号注册:登录微信公众平台注册小程序账号,选择“机构版”类型,获取唯一AppID。资质认证:基础资质:企业营业执照、法人身份证、对公账户信息。特殊资质:涉及支付功能:需办理《增值电信业务经营许可证》(ICP证)。涉及教育/医疗内容:需《互联网信息服务许可证》或相关行业资质。1.2技术选型:高效与扩展并重模块推荐方案前端框架微信原生框架(WXML+W</div>
                    </li>
                    <li><a href="/article/1949966789882474496.htm"
                           title="Android布局文件中的xmlns:tools" target="_blank">Android布局文件中的xmlns:tools</a>
                        <span class="text-muted">Huang兄</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>2018-01-04文章目录androidapptoolstools可以干什么ErrorhandlingattributesDesign-timeviewattributes(设计时试图属性)tools:insteadofandroidtools:contexttools:itemCounttools:layouttools:listitem/tools:listheader/tools:list</div>
                    </li>
                    <li><a href="/article/1949925685418061824.htm"
                           title="Vue3中Axios的使用-附完整代码" target="_blank">Vue3中Axios的使用-附完整代码</a>
                        <span class="text-muted">【本人】</span>
<a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a>
                        <div>前言首先介绍一下什么是axiosAxios是一个基于promise网络请求库,作用于node.js和浏览器中。它是isomorphic的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.jshttp模块,而在客户端(浏览端)则使用XMLHttpRequests官方网站:Axios中文文档|Axios中文网目前官方最新版本1.8.4一、Axios优势1.简单易用Axio</div>
                    </li>
                    <li><a href="/article/1949918624361803776.htm"
                           title="spring boot入门" target="_blank">spring boot入门</a>
                        <span class="text-muted">开往1982</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>SpringBoot简介(脚手架)简化Spring应用开发的一个框架;整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案;优点:快速创建独立运行的spring项目以及与主流框架集成使用嵌入式的Servlet容器,应用无需打成war包,内嵌TomcatStarters自动依赖和版本控制大量的自动装配,简化开发,也可以修改默认值无需配置XML无代码生成开箱即用准生产环境的运行时应用监控与</div>
                    </li>
                    <li><a href="/article/1949912195026448384.htm"
                           title="Python YAML文件处理完全指南:从入门到精通" target="_blank">Python YAML文件处理完全指南:从入门到精通</a>
                        <span class="text-muted">Yant224</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C%E4%B8%8E%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/1.htm">文件操作与异常处理</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/YAML/1.htm">YAML</a><a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E5%A4%84%E7%90%86/1.htm">配置文件处理</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">数据序列化</a><a class="tag" taget="_blank" href="/search/PyYAML/1.htm">PyYAML</a><a class="tag" taget="_blank" href="/search/ruamel.yaml/1.htm">ruamel.yaml</a>
                        <div>一、YAML基础与Python环境搭建1.YAML简介YAML(YAMLAin’tMarkupLanguage)是一种人类可读的数据序列化格式,特点:使用缩进表示层级关系支持复杂数据结构包含注释功能跨语言兼容2.核心特性对比特性YAMLJSONXML可读性★★★★★★★☆☆☆★★★☆☆注释支持✅❌✅数据类型丰富基本基本语法复杂度简单简单复杂3.安装PythonYAML库#安装PyYAML(基础库)</div>
                    </li>
                    <li><a href="/article/1949898065297076224.htm"
                           title="使用memory_profiler 与 cProfile ,line_profiler 优化Python程序运行时间和内存消耗实例" target="_blank">使用memory_profiler 与 cProfile ,line_profiler 优化Python程序运行时间和内存消耗实例</a>
                        <span class="text-muted">NG7711</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E4%BC%98%E5%8C%96/1.htm">优化</a>
                        <div>背景一个用来分析log(XML格式)的程序,运行起来时间很长,有时候内存消耗也会很高。使用pythonprofiler工具来分析使用memory_profiler分析内存消耗运行profiler按照memory_profilerguide,给有可能消耗内存的函数加上decorator@profile开始profiler:mprofrunxxx|tee$(date+“%Y%m%d%I%M_%p”).</div>
                    </li>
                    <li><a href="/article/1949860731180609536.htm"
                           title="Spring 框架中获取 org.w3c.dom.Document 对象的完整流程" target="_blank">Spring 框架中获取 org.w3c.dom.Document 对象的完整流程</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/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                        <div>引言在Java开发中,XML是一种广泛使用的格式,用于定义配置文件、数据交换等场景。在Spring框架中,XML文件常用于配置应用程序上下文(如applicationContext.xml),或者处理外部系统传输的XML数据。org.w3c.dom.Document是JavaDOMAPI的核心接口,表示一个XML文档的树形结构,允许开发者以编程方式访问和操作XML的内容。Spring框架本身并不直</div>
                    </li>
                    <li><a href="/article/1949860728919879680.htm"
                           title="深入解析 Spring 获取 XML 验证模式的过程" target="_blank">深入解析 Spring 获取 XML 验证模式的过程</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/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>关键要点Spring的XML验证模式:Spring框架在加载XML配置文件时,会根据文件内容判断使用DTD(文档类型定义)或XSD(XML模式定义)进行验证。自动检测机制:Spring默认使用自动检测(VALIDATION_AUTO)来确定验证模式,通过检查XML文件是否包含DOCTYPE声明来决定使用DTD或XSD。XSD的优先级:Spring倾向于使用XSD,因为它支持命名空间、复杂数据类型和</div>
                    </li>
                    <li><a href="/article/1949859342622715904.htm"
                           title="深入理解 Spring IOC:从概念到实践" target="_blank">深入理解 Spring IOC:从概念到实践</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>目录一、引言二、什么是IOC?2.1控制反转的本质2.2类比理解三、SpringIOC的核心组件3.1IOC容器的分类3.2Bean的生命周期四、依赖注入(DI)的三种方式4.1构造器注入4.2Setter方法注入4.3注解注入(推荐)五、案例演示:从XML配置到注解驱动5.1XML配置方式5.2注解驱动方式(推荐)六、SpringIOC的优势与注意事项6.1核心优势6.2注意事项七、总结一、引言</div>
                    </li>
                    <li><a href="/article/1949858838136025088.htm"
                           title="XPath" target="_blank">XPath</a>
                        <span class="text-muted">class心平气和</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>一、XPath基础概念XPath(XMLPathLanguage)是一种用于在XML或HTML文档中定位节点的语言,广泛应用于网页爬虫、数据提取和文档处理。以下将从基础概念到高级技巧全面解析XPath。XPath是一种路径表达式语言,用于在XML/HTML文档中导航和选择节点。二、XPath路径表达式基础1.绝对路径与相对路径绝对路径:从根节点开始,用/分隔,例:/html/body/div#从H</div>
                    </li>
                    <li><a href="/article/1949848870162853888.htm"
                           title="MyBatis与MyBatis-Plus批量插入实战指南" target="_blank">MyBatis与MyBatis-Plus批量插入实战指南</a>
                        <span class="text-muted">代码小侦探</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a>
                        <div>在实际项目中,批量插入数据是一个常见且重要的需求。本文将详细总结MyBatis和MyBatis-Plus常用的几种批量插入方式,并通过实际代码示例和运行结果,帮助大家更好地理解和应用。一、准备工作导入pom.xml依赖mysqlmysql-connector-javaruntimeorg.mybatis.spring.bootmybatis-spring-boot-starter2.2.2com.</div>
                    </li>
                    <li><a href="/article/1949846474460295168.htm"
                           title="Spring Boot与MyBatis完美融合:整合实战指南" target="_blank">Spring Boot与MyBatis完美融合:整合实战指南</a>
                        <span class="text-muted"></span>

                        <div>目录1、梳理整合思路2、整合实现2.1环境搭建2.2案例3、整合mybatis-plus报错1.依赖问题2.配置问题3.Mapper接口与XML文件问题4.实体类问题5.数据库连接问题6.SQL语句问题7.Spring容器问题8.其他1、梳理整合思路将MyBatis的DataSource交给SpringIoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数</div>
                    </li>
                    <li><a href="/article/1949830850329767936.htm"
                           title="【Spring Boot 整合 MyBatis 详细教程】" target="_blank">【Spring Boot 整合 MyBatis 详细教程】</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/boot/1.htm">boot</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>文章目录SpringBoot整合MyBatis详细教程简介环境准备项目搭建项目结构配置项目1.`pom.xml`配置2.`数据源和MyBatis`配置3.`启动类`配置4.`Mapper接口`和`XML映射文件`测试总结SpringBoot整合MyBatis详细教程简介SpringBoot与MyBatis的整合可以让你轻松地构建数据访问层,通过简化配置和自动配置功能,使得开发者可以更加专注于业务逻</div>
                    </li>
                    <li><a href="/article/1949799588810518528.htm"
                           title="Spring Boot Starter深度解析与实践" target="_blank">Spring Boot Starter深度解析与实践</a>
                        <span class="text-muted">t0_54coder</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%89%8B%E5%86%8C/1.htm">编程问题解决手册</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%BC%80%E5%8F%91/1.htm">编程开发</a>
                        <div>SpringBootStarter深度解析与实践简介SpringBoot是一个开源Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序。它设计时考虑了无需进行大量的XML配置,通过starters提供依赖管理,简化了项目配置。SpringBootStarter概览SpringBoot的starters是一组jar依赖,它们提供了一种快速配置应用程序的方式,而无需手动包含许多相关的</div>
                    </li>
                    <li><a href="/article/1949730991291559936.htm"
                           title="SpringMVC——请求参数乱码问题" target="_blank">SpringMVC——请求参数乱码问题</a>
                        <span class="text-muted">李沐泽</span>
<a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a>
                        <div>请求参数中文乱码的解决在web.xml中配置Spring提供的过滤器类characterEncodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtruecharacterEncodingFilter/*上述代码中encoding用来设置编码格式,而forceEncod</div>
                    </li>
                    <li><a href="/article/1949726580691496960.htm"
                           title="SpringMVC——CharacterEncodingFilter处理获取请求参数的乱码" target="_blank">SpringMVC——CharacterEncodingFilter处理获取请求参数的乱码</a>
                        <span class="text-muted">程序员阿皓</span>
<a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><a class="tag" taget="_blank" href="/search/springmvc/1.htm">springmvc</a><a class="tag" taget="_blank" href="/search/%E8%AF%B7%E6%B1%82%E4%B9%B1%E7%A0%81%E9%97%AE%E9%A2%98/1.htm">请求乱码问题</a>
                        <div>在SpringMVC中,处理请求参数的乱码问题通常可以通过配置CharacterEncodingFilter来解决。乱码问题通常出现在GET请求的URL参数或POST请求的表单参数中,特别是涉及到非英文字符时。详细步骤如下:首先,在web.xml中配置CharacterEncodingFilter:encodingFilterorg.springframework.web.filter.Chara</div>
                    </li>
                    <li><a href="/article/1949706028794834944.htm"
                           title="maven-shade-plugin插件将项目打成可执行的jar包" target="_blank">maven-shade-plugin插件将项目打成可执行的jar包</a>
                        <span class="text-muted">九师兄</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%85%B7-maven/1.htm">工具-maven</a>
                        <div>使用maven-shade-plugin插件将项目打成可执行的jar包1、在pom.xml文件中添加maven-shade-plugin插件全部文件:maven-compiler-plugin1.61.6org.apache.maven.plugins<</div>
                    </li>
                    <li><a href="/article/1949705776549392384.htm"
                           title="《Maven 核心基础笔记(第一天)》" target="_blank">《Maven 核心基础笔记(第一天)》</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><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>1.说明maven软件依赖管理和项目构建功能maven是为Java项目工作的功能体现:依赖管理,项目构建依赖管理:我们只需要写配置文件(pom.xml),maven就会帮我们下载依赖,并且也会下载依赖的依赖。项目构建:项目源文件通过一系列的过程(清理,编译,测试,打包,报告,部署)构建可执行的文件项目构建的好处:不同的开发工具具有相同的项目结构maven的构建过程对外完全开放透明。2.解释mave</div>
                    </li>
                    <li><a href="/article/1949686607569285120.htm"
                           title="SpringBoot—整合log4j2入门和log4j2.xml配置详解" target="_blank">SpringBoot—整合log4j2入门和log4j2.xml配置详解</a>
                        <span class="text-muted">LuckyTHP</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/log4j/1.htm">log4j</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                        <div>引言对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维。而日志的输出需要有一定的规划,如日志命名、日志大小,日志分割的文件个数等。在Spring的框架下,我们可以使用log4j来进行日志的设置,高版本的SpringBoot会使用log4j2。介绍log4j2概述截取官网的原话:ApacheLog4j2isanupgradetoLog4jthatprovidessignifican</div>
                    </li>
                    <li><a href="/article/1949684840974577664.htm"
                           title="Spring Boot 配置文件常用配置属性详解(application.properties / application.yml)" target="_blank">Spring Boot 配置文件常用配置属性详解(application.properties / application.yml)</a>
                        <span class="text-muted"></span>

                        <div>前言SpringBoot的一大优势就是通过简单的配置文件即可快速定制应用行为,而无需编写大量XML配置或Java代码。SpringBoot使用application.properties或application.yml作为核心配置文件,支持丰富的配置属性。本文将详细介绍SpringBoot常用的配置属性,包括:服务器配置数据源配置JPA/Hibernate配置日志配置Thymeleaf/模板引擎配</div>
                    </li>
                    <li><a href="/article/1949674543010344960.htm"
                           title="AppBarLayout" target="_blank">AppBarLayout</a>
                        <span class="text-muted">dev晴天</span>

                        <div>1AndroidDesignSupportLibrary中的控件2AppBarLayout继承自LinearLayout,子控件默认为竖直方向显示。3用它实现MaterialDesign的Toolbar隐藏效果;它支持滑动手势;它的子控件可以通过在代码里调用setScrollFlags(int)或者在XML里app:layout_scrollFlags来设置它的滑动手势。4实现这些的前提是它的根布</div>
                    </li>
                    <li><a href="/article/1949565633033203712.htm"
                           title="springboot + mybatis使用xml方式九" target="_blank">springboot + mybatis使用xml方式九</a>
                        <span class="text-muted">AmeeLove</span>

                        <div>springboot集成mybatis使用xml方式依赖org.springframework.bootspring-boot-starter-parent1.5.12.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.sprin</div>
                    </li>
                    <li><a href="/article/1949559653234962432.htm"
                           title="ServletRegistrationBean相关知识点" target="_blank">ServletRegistrationBean相关知识点</a>
                        <span class="text-muted"></span>

                        <div>ServletRegistrationBean相关知识点ServletRegistrationBean是SpringBoot中用于注册和配置Servlet组件的工具类,它简化了传统JavaWeb中通过web.xml配置Servlet的流程,允许以编程方式注册自定义Servlet并设置其映射规则等属性。1.核心作用在SpringBoot应用中,ServletRegistrationBean的主要功能</div>
                    </li>
                    <li><a href="/article/1949557259424034816.htm"
                           title="Python XML解析" target="_blank">Python XML解析</a>
                        <span class="text-muted">写程序的猿</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>XML是一种用于存储和交换数据的标记语言。Python提供了多种库,可以用于解析XML文件。本指南将介绍三种最常用的解析库:xml.etree.ElementTree、xml.dom.minidom和lxml。xml.etree.ElementTreexml.etree.ElementTree是Python内置的库,用于解析XML文件并将其转换为Python对象。它使用DOM解析器,并且具有简单易</div>
                    </li>
                    <li><a href="/article/1949554485672079360.htm"
                           title="pythonxml库_Python 标准库之 XML(下)" target="_blank">pythonxml库_Python 标准库之 XML(下)</a>
                        <span class="text-muted">weixin_39722965</span>
<a class="tag" taget="_blank" href="/search/pythonxml%E5%BA%93/1.htm">pythonxml库</a>
                        <div>写在之前大家好,这是首发在我公众号「Python空间」的第72篇文章,欢迎关注,期待和你的交流。隔了两天了,不知道你们还记得上一篇文章的内容不,如果不记得的话请移步--Python标准库之XML(上)。今天我们继续来学习XML的剩下的内容,主要是编辑和一些常用属性和方法的总结,下面开始今天的学习。编辑(增删改查)我们还是用上一篇文章中的例子,为了方便查看,我把内容再粘贴过来,下面的内容记得保存并且</div>
                    </li>
                    <li><a href="/article/1949552340348497920.htm"
                           title="Python-XML模块" target="_blank">Python-XML模块</a>
                        <span class="text-muted">一ye残雪</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                        <div>Python-XML模块0前言1XML语法1.1文档申明1.2元素和节点element1.3命名空间1.4实体字符1.5CDATA节1.6注释1.7处理指令2XML模块(内置库)2.1方法列表2.2新建XML文件2.3查找XML文件2.3.1按路径定位一个节点getrootfind2.3.2按路径遍历节点findall2.3.3按范围遍历节点iter2.3.4打印节点tostring2.4修改和删</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>