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/1942344237207056384.htm"
                           title="springboot3.x中集成springdoc-openapi" target="_blank">springboot3.x中集成springdoc-openapi</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/java/1.htm">java</a>
                        <div>springdoc-openapi简介springdoc-openapijava库有助于使用springboot项目自动生成API文档。之前项目组一直用的Swagger库,一方面官方一直不更新,另一方面在SpringBoot升级到3.0.x之后SpringFox也是无法继续支持Swagger了,对此官方给出的建议是用另一种接口文档解决方案SpringDoc1、在pom.xml中引入SpringDo</div>
                    </li>
                    <li><a href="/article/1942328352207597568.htm"
                           title="sqlserver 将多个字段合并成一个字段" target="_blank">sqlserver 将多个字段合并成一个字段</a>
                        <span class="text-muted">chtholl</span>
<a class="tag" taget="_blank" href="/search/sqlserver%E5%AD%A6%E4%B9%A0/1.htm">sqlserver学习</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>1.字段为竖向显示的时候在这里我们合并sqr,将id为(47,50,51)合并SELECTname=((stuff((SELECT','+CAST(a.sqrASVARCHAR)FROMformtable_main_11aWHEREa.idin(47,50,51)ORDERBYa.idFORxmlpath('')),1,1,'')))显示结果:2.字段为横向显示的时候合并在这里我们合并(reque</div>
                    </li>
                    <li><a href="/article/1942249289698832384.htm"
                           title="java项目打包成 Docker 镜像几种方式" target="_blank">java项目打包成 Docker 镜像几种方式</a>
                        <span class="text-muted">reiraoy</span>
<a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>1.准备工作安装Docker:确保本地或服务器上已安装Docker。创建SpringBoot项目:假设你已经有一个SpringBoot项目。2.使用docker-maven-plugin打包Docker镜像(1)在pom.xml中添加插件            com.spotify      docker-maven-plugin      1.2.2              ${projec</div>
                    </li>
                    <li><a href="/article/1942239954105069568.htm"
                           title="android 音量调整" target="_blank">android 音量调整</a>
                        <span class="text-muted">盼雨落,等风起</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%8D%93/1.htm">安卓</a><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>1流程图2audio_policy_volumes.xml阐述了流跟device的音量范围【AndroidAudio】5、EngineBase加载音量曲线和策略【基于AndroidQ】1.按键处理1.1从输入子系统到音频子系统的处理按键会从inputReader的getEvent到inputDisptacher最后到ViewRootimpl中的ViewPostImeInputStage::proc</div>
                    </li>
                    <li><a href="/article/1942239449261862912.htm"
                           title="Mybatis" target="_blank">Mybatis</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/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>1、概述什么是mybatis?MyBatis是一个基于Java的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(PlainOrdinaryJavaObjects,普通的Java对象)映射成数据库中的记录。它是一款半自动的ORM持久层</div>
                    </li>
                    <li><a href="/article/1942193427735179264.htm"
                           title="解决org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON...问题" target="_blank">解决org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON...问题</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/json/1.htm">json</a>
                        <div>报错如下:Resolved[org.springframework.http.converter.HttpMessageNotWritableException:CouldnotwriteJSON:(wasjava.lang.NullPointerException);nestedexceptioniscom.fasterxml.jackson.databind.JsonMappingExcept</div>
                    </li>
                    <li><a href="/article/1942184732196401152.htm"
                           title="发起请求并处理响应:`XHR` 与 `axios` 使用指南来啦[特殊字符]~" target="_blank">发起请求并处理响应:`XHR` 与 `axios` 使用指南来啦[特殊字符]~</a>
                        <span class="text-muted"></span>

                        <div>又又又要长脑子呐~了解到通过发起HTTP请求并在不刷新页面的情况下更新页面内容是一种常见的需求。学习使用XMLHttpRequest或axios来实现,现在进行对比两者,比较项目使用时候的优缺点,文末使用表格进行对比学习1.使用XHR实现下面是一个使用XMLHttpRequest发起GET请求并处理服务器响应的示例:html体验AI代码助手代码解读复制代码//创建一个新的XMLHttpReques</div>
                    </li>
                    <li><a href="/article/1942134691977031680.htm"
                           title="MyBatis Mapper.xml核心属性详解" target="_blank">MyBatis Mapper.xml核心属性详解</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/xml/1.htm">xml</a>
                        <div>在MyBatis的Mapper.xml文件中,statement标签(如、等)包含多个关键属性,用于定义SQL语句的行为和映射规则。以下是核心属性及其含义:一、基础属性id作用:当前命名空间下SQL语句的唯一标识,必须与对应Mapper接口的方法名一致。示例:对应接口方法UsergetUserById(intid)。parameterType作用:指定输入参数的类型(如java.lang.Inte</div>
                    </li>
                    <li><a href="/article/1942058158918791168.htm"
                           title="xml笔记" target="_blank">xml笔记</a>
                        <span class="text-muted">shuangmu9768</span>
<a class="tag" taget="_blank" href="/search/java%E7%AC%94%E8%AE%B0/1.htm">java笔记</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><a class="tag" taget="_blank" href="/search/schema/1.htm">schema</a><a class="tag" taget="_blank" href="/search/xsd/1.htm">xsd</a>
                        <div>【1】基础【2】schema示例【3】schema校验【4】xsd位置【1】基础#xmlns命名空间的语法xmlns:namespace-prefix="namespaceURI"#targetNamespace该属性声明了本XMLSchema文档中定义的元素是属于targetNamespace属性指定的命名空间(URI)下的。可以将默认命名空间xmlns和targetNamespace给定不一样</div>
                    </li>
                    <li><a href="/article/1942057778772242432.htm"
                           title="xml文件笔记" target="_blank">xml文件笔记</a>
                        <span class="text-muted"></span>

                        <div>今天学习了一下xml下面是总结的一些笔记Xml可以用来配置文件xml特点:Xml可以从HTYML中分离数据可以利用xml文件在不兼容的系统之间交换数据Xml数据以纯文本格式存储Xml与其他软硬件的耦合度更低,数据可以被更多的设备利用,还可以将XML文件当作数据源来处理,就像操作数据库一样Xml的格式在xml文件头部要有声明在XML中字母的大小写是敏感的Xml文件中有且只有一个根元素,所有的其他元素</div>
                    </li>
                    <li><a href="/article/1942054122752634880.htm"
                           title="SOUI的init.xml" target="_blank">SOUI的init.xml</a>
                        <span class="text-muted"></span>

                        <div>SOUI的init.xml的保存着UIDEF,这个文件的加载代码如下:IUiDefInfo*pUiDef=SUiDef::getSingleton().CreateUiDefInfo(pResProvider,pszUidef);SUiDef::getSingleton().SetUiDef(pUiDef,true);其中SUiDef为SApp中的一个单列对像,它负责解析init.xml。例如下列</div>
                    </li>
                    <li><a href="/article/1942053364900622336.htm"
                           title="【XML笔记】XML入门_XML文档的创建" target="_blank">【XML笔记】XML入门_XML文档的创建</a>
                        <span class="text-muted">追云的帆</span>
<a class="tag" taget="_blank" href="/search/JavaWeb/1.htm">JavaWeb</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%A1%A3/1.htm">文档</a>
                        <div>一.XML1.概述:XML是ExtensibleMarkupLanguage可扩展标记语言是SGML(标准通用化标记语言)的一个子集,用于提供数据描述格式,适用于不同应用程序间的数据交换,这种交换不以预先定义的数据结构为前提,增强了可扩展性。一个基本的XML文档由序言和文档元素两部分构成2.序言在XML文档的第一行通常是XML声明,用于说明这是一个XML文档。XML声明的语法格式如下:versio</div>
                    </li>
                    <li><a href="/article/1942053112642596864.htm"
                           title="oracle操作xml笔记" target="_blank">oracle操作xml笔记</a>
                        <span class="text-muted">chushiyunen</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>文章目录第一个例子EXTRACTVALUE()方法oracle这么成熟的数据库,肯定对xml有很好的支持了。第一个例子创建表:CREATETABLExml_table(idNUMBERPRIMARYKEY,xml_dataXMLType);插入数据:INSERTINTOxml_table(id,xml_data)VALUES(1,XMLType('Value'));查询:SELECTEXTRACT</div>
                    </li>
                    <li><a href="/article/1942047941598441472.htm"
                           title="XML 笔记" target="_blank">XML 笔记</a>
                        <span class="text-muted">ddfa1234</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>换行在XML中,用于定义一个CDATA节(CharacterDataSection)。CDATA节是用于将一段文本标记为不应当被解析器解析的字符数据。这意味着,在CDATA节内部的所有内容,包括特殊字符如,&等,都不会被当作标记来处理,而是作为纯文本数据对待。CDATA节的主要用途:包含大量特殊字符:当你需要在XML文档中包含大量的特殊字符(比如,&),而不想对这些字符进行转义时(例如<,&</div>
                    </li>
                    <li><a href="/article/1941924163442765824.htm"
                           title="ROS 从入门到放弃 - 入门" target="_blank">ROS 从入门到放弃 - 入门</a>
                        <span class="text-muted">SuperFeHanHan</span>
<a class="tag" taget="_blank" href="/search/ROS/1.htm">ROS</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>ROS从入门到放弃-入门1.InstallingandConfiguringYourROSEnvironment2.NavigatingtheROSFilesystemPackages&Manifests:文件管理操作:3.CreatingaROSPackage3.1Package的组成:3.2一个Worksapce的组成3.3创建一个Packagepackage.xml中各tag的介绍:4.Bu</div>
                    </li>
                    <li><a href="/article/1941913180028596224.htm"
                           title="Maven、测试、Junit依赖" target="_blank">Maven、测试、Junit依赖</a>
                        <span class="text-muted"></span>

                        <div>Maven的作用管理依赖:通过pom.xml管理项目依赖的资源(jar包)。(不再需要每次都手动导入jar包)项目构建(标准化跨平台的项目构建方式):complie,test,package,install(编译,测试,打包,发布)等项目构建流程统一项目结构:提供标准、统一的项目结构(主程序,测试程序)仓库:用于存储资源,管理各种jar包。本地仓库:自己计算机上的一个目录。(在安装maven的时候</div>
                    </li>
                    <li><a href="/article/1941808887279710208.htm"
                           title="\SpringBootDemo-1.0-SNAPSHOT.jar中没有主清单属性" target="_blank">\SpringBootDemo-1.0-SNAPSHOT.jar中没有主清单属性</a>
                        <span class="text-muted">郭宝</span>
<a class="tag" taget="_blank" href="/search/JavaEE/1.htm">JavaEE</a><a class="tag" taget="_blank" href="/search/%23/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/jar/1.htm">jar</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>背景:java-jar.\SpringBootDemo-1.0-SNAPSHOT.jar--spring.profiles.active=dev在运行打包以后的maven项目时,出现了如下报错信息解决办法:1、需要在项目根目录下的pom.xml文件中添加SpringBoot构建的插件org.springframework.bootspring-boot-maven-pluginrepackage<</div>
                    </li>
                    <li><a href="/article/1941771684780503040.htm"
                           title="AndroidStudio用华为手机调试出现联网即闪退问题的解决办法" target="_blank">AndroidStudio用华为手机调试出现联网即闪退问题的解决办法</a>
                        <span class="text-muted">鹿小黑</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>第一步:调试一开始出现的错误:java.lang.NoClassDefFoundError:Failedresolutionof:Lorg/apache/http/impl/client/DefaultHttpClient解决方法:在manifest.xml文件中的application节点下添加第二步:执行上述步骤后调试出现的错误:java.io.IOException:Cleartexttra</div>
                    </li>
                    <li><a href="/article/1941752774165327872.htm"
                           title="加载properties文件username取不到值" target="_blank">加载properties文件username取不到值</a>
                        <span class="text-muted">bigStone.</span>
<a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/1.htm">问题总结</a><a class="tag" taget="_blank" href="/search/properties/1.htm">properties</a><a class="tag" taget="_blank" href="/search/username/1.htm">username</a><a class="tag" taget="_blank" href="/search/properties%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/1.htm">properties配置文件</a>
                        <div>  今天把Git上的项目(SSH整合)换台电脑Pull下来。竟然启动不了。在自己本上可以跑,换台电脑就不行了?各种报错,反正就是启动不来。  错误信息不做展示了,三个小时后定位到错误位置为applicationContext.xml中加载外部jdbc.properties文件出错。jdbc.properties文件:jdbcUrl=jdbc:mysql://localhost:3306/hello</div>
                    </li>
                    <li><a href="/article/1941737137896484864.htm"
                           title="四、idea环境配置,项目jar包上传nexus" target="_blank">四、idea环境配置,项目jar包上传nexus</a>
                        <span class="text-muted">鹏哥哥啊Aaaa</span>
<a class="tag" taget="_blank" href="/search/%E6%88%91%E7%9A%84%E8%BD%AE%E5%AD%90/1.htm">我的轮子</a><a class="tag" taget="_blank" href="/search/intellij-idea/1.htm">intellij-idea</a><a class="tag" taget="_blank" href="/search/jar/1.htm">jar</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>目录一、基础环境配置1.设置maven的setting.xml2.设置字符编码3.注解生效激活4.编译版本5.FileType过滤6.安装插件lombok二、common的项目结构和pom.xml三、common项目的代码四、上传jar包到nexus一、基础环境配置1.设置maven的setting.xmlE:\mavenSou</div>
                    </li>
                    <li><a href="/article/1941718718421725184.htm"
                           title="Mybatis源码,从配置到 mappedStatement/mapper.xml 是如何被解析的?" target="_blank">Mybatis源码,从配置到 mappedStatement/mapper.xml 是如何被解析的?</a>
                        <span class="text-muted">祁娥安</span>
<a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a>
                        <div>今天跟大家分享下Mybatis源码,从配置到mappedStatement/mapper.xml解析的知识。1从MybatisAutoConfiguration说开去,mapper文件是怎么扫描的?Ext1:本文源码解析基于mybatis-spring-boot-starter2.1.1,即mybatis3.5.3版本。Ext2:本文主要是对源码的讲解,着重点会是在源码上。我们知道配置SqlSes</div>
                    </li>
                    <li><a href="/article/1941705969138462720.htm"
                           title="java面试题61什么是Ajax?Ajax实现原理?列举Ajax的几种运用场景" target="_blank">java面试题61什么是Ajax?Ajax实现原理?列举Ajax的几种运用场景</a>
                        <span class="text-muted">码农颜</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a><a class="tag" taget="_blank" href="/search/okhttp/1.htm">okhttp</a>
                        <div>什么是Ajax?Ajax(AsynchronousJavaScriptandXML)是一种用于创建异步Web应用的技术。它允许网页在不重新加载整个页面的情况下,通过后台与服务器交换少量数据并动态更新部分页面内容。核心特点:异步通信:浏览器在后台发送/接收数据,用户无需等待局部刷新:只更新页面中需要变化的部分无刷新体验:用户操作流畅,避免页面闪烁类比:传统网页像翻书(每次请求翻新页),Ajax像实时</div>
                    </li>
                    <li><a href="/article/1941700284573085696.htm"
                           title="11.前后端分页功能详解" target="_blank">11.前后端分页功能详解</a>
                        <span class="text-muted">全栈凯哥</span>
<a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88%E9%A1%B9%E7%9B%AE/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/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>文章目录1.分页功能基础概念1.1什么是分页1.2为什么需要分页1.3分页的关键参数1.4分页的实现方式2.MyBatisPageHelper详解2.1PageHelper简介2.2添加PageHelper依赖2.3PageHelper配置2.4创建实体类2.5创建Mapper接口2.6创建MapperXML文件3.封装分页请求和响应参数3.1分页请求参数封装3.2用户查询请求参数3.3分页响应结</div>
                    </li>
                    <li><a href="/article/1941611160008716288.htm"
                           title="【微信小程序】小程序的双线程架构,为什么要设计成双线程的,双线程之间如何通信" target="_blank">【微信小程序】小程序的双线程架构,为什么要设计成双线程的,双线程之间如何通信</a>
                        <span class="text-muted">我有一棵树</span>
<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/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">微信小程序</a>
                        <div>在开始学习之前,建议看一下官方文档逻辑层和渲染层微信小程序是双线程的,有渲染层和逻辑层两个执行环境,渲染层负责页面的渲染和样式,逻辑层负责小程序的逻辑和数据处理。渲染线程:渲染层使用了WebView负责渲染界面,包括解析wxml,wxss,样式计算,布局排版和绘制试图等操作。一个页面是一个WebView,所以渲染层会有多个webview逻辑线程:基于有JsCore运行js脚本,负责处理业务逻辑和数</div>
                    </li>
                    <li><a href="/article/1941608891955605504.htm"
                           title="掌握小程序开发框架,驰骋小程序领域" target="_blank">掌握小程序开发框架,驰骋小程序领域</a>
                        <span class="text-muted">小程序开发2020</span>
<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/ai/1.htm">ai</a>
                        <div>掌握小程序开发框架,驰骋小程序领域关键词:小程序框架、WXML、WXSS、逻辑层、组件化开发、生命周期、跨平台摘要:本文以“如何系统掌握小程序开发框架”为核心,通过生活比喻、代码实战和场景分析,拆解小程序框架的核心组成(WXML/WXSS/JS/JSON)、运行机制(双线程模型)及开发技巧。无论你是刚入门的新手,还是想巩固基础的开发者,都能通过本文理清框架逻辑,快速上手实战,为开发高性能小程序打下</div>
                    </li>
                    <li><a href="/article/1941608892475699200.htm"
                           title="小程序的「双线程模型」" target="_blank">小程序的「双线程模型」</a>
                        <span class="text-muted">TE-茶叶蛋</span>
<a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91/1.htm">小程序开发</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a>
                        <div>文章目录前言一、双线程模型结构概览二、逻辑层(AppService)示例:️三、渲染层(WebView)示例(WXML):四、通信机制(Native层桥接)⚙️通信方式:底层实现方式:五、为什么这么设计?缺点与限制总结结构图✅实践建议扩展小程序双线程模型的**进阶架构扩展**一、支持WebWorker的多线程能力(逻辑层并发能力增强)✅使用示例:⚠️注意:二、沙箱机制强化(增强渲染安全)三、小程序</div>
                    </li>
                    <li><a href="/article/1941601080320258048.htm"
                           title="微信小程序弹框组件封装" target="_blank">微信小程序弹框组件封装</a>
                        <span class="text-muted">dreamimport</span>
<a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91%E5%AE%9E%E9%99%85%E5%8A%9F%E8%83%BD/1.htm">微信小程序开发实际功能</a><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/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>popup组件,居中和底部弹起1.popup.wxml<</div>
                    </li>
                    <li><a href="/article/1941600321943957504.htm"
                           title="Python 中 BeautifulSoup 的异常处理方法" target="_blank">Python 中 BeautifulSoup 的异常处理方法</a>
                        <span class="text-muted">Python编程之道</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/beautifulsoup/1.htm">beautifulsoup</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>Python中BeautifulSoup的异常处理方法关键词:Python,BeautifulSoup,异常处理,Web解析,HTML解析,XML解析,错误处理摘要:本文深入探讨了Python中BeautifulSoup库在进行HTML和XML解析时的异常处理方法。首先介绍了BeautifulSoup的基本背景和相关概念,接着详细阐述了可能出现的各类异常及其产生原因,通过具体的Python代码示例</div>
                    </li>
                    <li><a href="/article/1941560748568276992.htm"
                           title="webpack基础教程" target="_blank">webpack基础教程</a>
                        <span class="text-muted"></span>

                        <div>webpack基础教程一webpack五大核心二webpack处理css资源三webpack处理less、scss、sass、styl资源四webpack-module的详细配置五webpack资源模块六webpack加载本地csv与XML文件七webpack打包babel资源八webpack打包HTML资源一webpack五大核心webpack的概念:就是个打包工具,例如把vue代码打包成浏览器</div>
                    </li>
                    <li><a href="/article/1941504260181127168.htm"
                           title="RestTemplate实战" target="_blank">RestTemplate实战</a>
                        <span class="text-muted">en-route</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                        <div>介绍RestTemplate是SpringFramework提供的一个同步HTTP客户端,用于与外部服务进行交互。它封装了常见的HTTP请求操作,简化了客户端发送HTTP请求、接收响应的过程。通过RestTemplate,你可以轻松地调用RESTfulAPIs,处理请求和响应的不同类型(如JSON、XML、文本等)。推荐用法RestTemplate中包含了许多方法,下面简单列举几个常用的:getF</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>