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/1896055602753368064.htm"
                           title="Ubuntu从零创建Hadoop集群" target="_blank">Ubuntu从零创建Hadoop集群</a>
                        <span class="text-muted">爱编程的王小美</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE%E4%B8%93%E4%B8%9A%E7%9F%A5%E8%AF%86%E7%B3%BB%E5%88%97/1.htm">大数据专业知识系列</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>目录前言前提准备1.设置网关和网段2.查看虚拟机IP及检查网络3.Ubuntu相关配置镜像源配置下载vim编辑器4.设置静态IP和SSH免密(可选)设置静态IPSSH免密5.JDK环境部署6.Hadoop环境部署7.配置Hadoop配置文件HDFS集群规划HDFS集群配置1.配置works文件2.配置hadoop-env.sh文件3.配置core-site.xml文件4.配置hdfs-site.x</div>
                    </li>
                    <li><a href="/article/1896042860462010368.htm"
                           title="spring mvc面试笔记" target="_blank">spring mvc面试笔记</a>
                        <span class="text-muted">表面矿工</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">面试题</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><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a>
                        <div>简述SpringMVC工作原理?SpringMVC工作原理:1:用户发送请求至前端控制器DispatcherServlet。2:DispatcherServlet收到请求调用HandlerMapping处理器映射器。3:处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4:Dispatcher</div>
                    </li>
                    <li><a href="/article/1896041723293921280.htm"
                           title="Android Studio中,设置页面布局有几种方式" target="_blank">Android Studio中,设置页面布局有几种方式</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><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/ide/1.htm">ide</a>
                        <div>在AndroidStudio中,设置页面布局主要有以下几种方式:1.使用XML布局文件这是最常见的方式,通过编写XML文件来定义界面布局。XML文件位于res/layout目录下。你可以在XML中使用各种布局控件(如LinearLayout、RelativeLayout、ConstraintLayout等)来组织界面元素。2.使用ConstraintLayoutConstraintLayout是一</div>
                    </li>
                    <li><a href="/article/1896041597028593664.htm"
                           title="最新版studio android 项目中 没有 activity_main.xml 文件,怎么回事" target="_blank">最新版studio android 项目中 没有 activity_main.xml 文件,怎么回事</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><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                        <div>因为下载的androidstudio是最新版本,新建项目形式都为新的(kotlin版本),但是在搜索相关文章时,很多文章都是基于(xml声明配置或java相关的),所以在摸索期间遇到很多问题。也在逐个遇见逐个击破。以上。在AndroidStudio项目中,activity_main.xml是默认创建的一个Layout文件,通常作为应用程序的主活动布局。如果你的项目中没有这个文件,可能有以下几种原因</div>
                    </li>
                    <li><a href="/article/1896027603450523648.htm"
                           title="ODX(Open Diagnostic Data Exchange)简介" target="_blank">ODX(Open Diagnostic Data Exchange)简介</a>
                        <span class="text-muted">aFakeProgramer</span>
<a class="tag" taget="_blank" href="/search/AP/1.htm">AP</a><a class="tag" taget="_blank" href="/search/AUTOSAR/1.htm">AUTOSAR</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/ODX/1.htm">ODX</a>
                        <div>ODX(OpenDiagnosticDataExchange)是一种由ASAM制定的开放标准,用于描述和交换ECU(电子控制单元)诊断数据,广泛应用于车辆诊断。ODX文件采用XML格式,包含通讯参数,如ISO15765-2/3时间参数。ASAM(AssociationforStandardisationofAutomationandMeasuringSystems)ODX文件的结构ODX文件的结构</div>
                    </li>
                    <li><a href="/article/1896018898206126080.htm"
                           title="基于ODX/OTX诊断的整车扫描" target="_blank">基于ODX/OTX诊断的整车扫描</a>
                        <span class="text-muted">「已注销」</span>
<a class="tag" taget="_blank" href="/search/Softing/1.htm">Softing</a><a class="tag" taget="_blank" href="/search/%E6%B1%BD%E8%BD%A6%E8%AF%8A%E6%96%AD/1.htm">汽车诊断</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E4%BB%AA/1.htm">测试仪</a><a class="tag" taget="_blank" href="/search/%E8%BD%A6%E8%BE%86%E8%AF%8A%E6%96%AD/1.htm">车辆诊断</a><a class="tag" taget="_blank" href="/search/%E8%AF%8A%E6%96%AD%E4%BB%AA/1.htm">诊断仪</a><a class="tag" taget="_blank" href="/search/%E6%B1%BD%E8%BD%A6%E7%94%B5%E5%AD%90/1.htm">汽车电子</a><a class="tag" taget="_blank" href="/search/ODX/1.htm">ODX</a><a class="tag" taget="_blank" href="/search/OTX/1.htm">OTX</a>
                        <div>|ODX(OpenDiagnosticdataeXchange)是基于XML语言、开放的诊断数据格式,用于车辆整个生命周期中诊断数据的交互。它一开始由ASAM提出并形成标准MCD-2D,后来以ODX2.2.0为基础形成了ISO标准——ISO22901-1。|OTX(OpenTestsequenceeXchange)是基于XML语言、开放的测试序列交换格式,用于描述基础的功能测试到整个测试应用的需求</div>
                    </li>
                    <li><a href="/article/1896015487490387968.htm"
                           title="ODX架构开发流程" target="_blank">ODX架构开发流程</a>
                        <span class="text-muted">芊言凝语</span>
<a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>一、引言随着汽车电子技术的飞速发展,诊断数据在汽车故障诊断和维护中的作用日益凸显。ODX(OpenDiagnosticDataExchange)作为一种标准化的诊断数据格式,其开发架构对于实现高效、准确的诊断系统至关重要。本文将详细阐述ODX架构开发流程,涵盖从需求分析到最终部署的各个环节,以帮助开发者更好地理解和实践这一复杂的开发过程。二、ODX架构概述ODX是一种基于XML的开放式诊断数据交换</div>
                    </li>
                    <li><a href="/article/1896013848167641088.htm"
                           title="XSL是指可扩展样式表语言 (EXtensible Stylesheet Language)" target="_blank">XSL是指可扩展样式表语言 (EXtensible Stylesheet Language)</a>
                        <span class="text-muted">万事俱备,就差一个程序员了</span>

                        <div>XSLXSL是指可扩展样式表语言(EXtensibleStylesheetLanguage),是一种用于以可读格式呈现XML数据的语言。目录简介语法XSL是否与XML相同用途应用简介XSL之于XML,就像CSS之于HTML。它是指可扩展样式表语言(EXtensibleStylesheetLanguage)。这是一种用于以可读格式呈现XML数据的语言。xsl是一种标记语言,表示如何将xml文档的内容</div>
                    </li>
                    <li><a href="/article/1896013344322678784.htm"
                           title="XSL样式表1" target="_blank">XSL样式表1</a>
                        <span class="text-muted">xuefeimengli2010</span>
<a class="tag" taget="_blank" href="/search/xsl/1.htm">xsl</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%A1%A3/1.htm">文档</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80/1.htm">语言</a><a class="tag" taget="_blank" href="/search/xslt/1.htm">xslt</a>
                        <div>第9章XSL样式表9。1什么是xsl9。2导入XSL样式表9。3不同的XML样式表9。4XSL的基本元素9。5如何选择节点9。6匹配节点的典型情况9。7常用的XSL函数介绍·XSL中文翻译为“可扩展的样式语言”·包括XSLT变换语言和XSL-FO格式化语言两分·XSLT·规定如何将XML文档变换成另一个XML文档。·变换后的XML文档可使用原文档的标记和DTD。·大多数情况下,它会使用一组不同的标</div>
                    </li>
                    <li><a href="/article/1896011072146567168.htm"
                           title="如何解析配置文件" target="_blank">如何解析配置文件</a>
                        <span class="text-muted">啊念着倒嘛干</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/json/1.htm">json</a>
                        <div>如何解析配置文件什么是配置文件?在计算机科学领域,配置文件(英语:configurationfile)是一种计算机文件,可以为一些计算机程序配置参数和初始设置。一个项目中,为什么要设置一个配置文件呢?方便修改参数设置和逻辑代码分离(解耦)(高内聚,低耦合)常见的配置文件格式:aaa.inixxx.xmlxxxxx.jsonxxfada.yaml什么是json文本、字符串、有固定的格式,格式长得像p</div>
                    </li>
                    <li><a href="/article/1896008297903878144.htm"
                           title="springboot中配置logback-spring.xml" target="_blank">springboot中配置logback-spring.xml</a>
                        <span class="text-muted">web13688565871</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><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/logback/1.htm">logback</a>
                        <div>一、在src/main/resources目录下,也就是在classpath路径下创建logback-spring.xml注:springboot框架自动配置,如果更换名称,可在配置文件指定该文件即可-->%d{yyyy-MM-ddHH:mm:ss}[%thread]%-5level%logger{80}-%msg%n${log_dir}/info.logINFOACCEPTDENY${log_d</div>
                    </li>
                    <li><a href="/article/1896005400419954688.htm"
                           title="XML标记语言简介" target="_blank">XML标记语言简介</a>
                        <span class="text-muted">ozawacai</span>
<a class="tag" taget="_blank" href="/search/Notes/1.htm">Notes</a><a class="tag" taget="_blank" href="/search/Of/1.htm">Of</a><a class="tag" taget="_blank" href="/search/Computer/1.htm">Computer</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                        <div>XML标记语言简介XML(eXtensibleMarkupLanguage,可扩展标记语言)是一种标记语言,设计用于存储和传输数据。它通过标签结构来描述数据,并且标签是自定义的,这使得XML非常灵活。以下是对XML及其用途、好处和应用场景的详细介绍:什么是XMLXML是一种文本格式,用于表示结构化信息。其设计目标是可读性好、易于理解和扩展。XML文档的基本结构如下:ContentXML的用途数据存</div>
                    </li>
                    <li><a href="/article/1896003507652194304.htm"
                           title="SpringBoot项目中替换指定版本的tomcat" target="_blank">SpringBoot项目中替换指定版本的tomcat</a>
                        <span class="text-muted">m0_54804970</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/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/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>在SpringBoot项目中替换指定版本的Tomcat,可以通过修改项目的`pom.xml`文件来实现。具体步骤如下:首先,查看当前SpringBoot项目中使用的Tomcat版本。可以通过查看`pom.xml`文件中的依赖项来确定。在`pom.xml`文件中,找到SpringBoot的依赖项,并添加或修改Tomcat的版本属性。例如,如果要将Tomcat版本修改为7.0.59,可以按照以下步骤操</div>
                    </li>
                    <li><a href="/article/1895997705650499584.htm"
                           title="API,URL,Token,XML,JSON是干嘛的" target="_blank">API,URL,Token,XML,JSON是干嘛的</a>
                        <span class="text-muted">Frank牛蛙</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/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a>
                        <div>API,URL,Token,XML,JSON是干嘛的API的作用API(ApplicationProgrammingInterface,应用程序编程接口)是一组定义和协议,用于构建和交互软件应用程序。API允许不同的软件系统之间进行通信,它定义了软件组件应该如何交互。具体到网络服务中,API通常是指一组HTTP请求和响应的规则,通过这些规则,开发者可以从外部访问某个服务的数据或功能。例如,Yaho</div>
                    </li>
                    <li><a href="/article/1895989246100041728.htm"
                           title="SpringBoot 项目集成 Prometheus 和 Grafana" target="_blank">SpringBoot 项目集成 Prometheus 和 Grafana</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/prometheus/1.htm">prometheus</a><a class="tag" taget="_blank" href="/search/grafana/1.htm">grafana</a>
                        <div>下面是一个完整的SpringBoot项目示例,集成Prometheus和Grafana进行性能监控,包括:Prometheus作为监控数据收集工具Micrometer作为指标采集库Grafana作为可视化展示工具步骤概览引入依赖:在pom.xml中添加Prometheus和Actuator相关依赖。配置SpringBoot:启用Actuator并暴露Prometheus端点。编写示例代码:使用Mi</div>
                    </li>
                    <li><a href="/article/1895939950474489856.htm"
                           title="高通CamX分析---01" target="_blank">高通CamX分析---01</a>
                        <span class="text-muted">疯狂敲bug</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                        <div>文章目录1.camx的入口2.硬件初始化HwEnvironment()3.XML文件解析3.1ProbeImageSensorModules3.2sensor模块创建3.2.1加载XML中数据3.2.2根据不同的entry->Type进入不同的module进行解析3.2.3解析actuatorXML数据3.2.4解析oisXML数据3.2.5解析sensorXML数据4.初始化sensor模块(s</div>
                    </li>
                    <li><a href="/article/1895936420514689024.htm"
                           title="ROS2入门教程—创建ROS2功能包(C++版)" target="_blank">ROS2入门教程—创建ROS2功能包(C++版)</a>
                        <span class="text-muted">Roar冷颜</span>
<a class="tag" taget="_blank" href="/search/ROS2%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/1.htm">ROS2入门教程</a><a class="tag" taget="_blank" href="/search/%E5%85%B6%E4%BB%96/1.htm">其他</a>
                        <div>ROS2入门教程—创建ROS2功能包(C++版)1ROS2中的功能包2创建功能包3编译功能包4设置环境变量5运行功能包6功能包中的内容7修改package.xml文件  功能包是ROS2中组织代码的基本容器,方便我们编译、安装、分发开发的代码,一般来讲,每个功能包都是用来完成某项具体的功能相对完整的单元。1ROS2中的功能包  ROS2中的功能包可以使用CMake或者Python两种方式来编译(本</div>
                    </li>
                    <li><a href="/article/1895935913024876544.htm"
                           title="【问题解决】org.springframework.web.util.NestedServletException Handler dispatch failed;" target="_blank">【问题解决】org.springframework.web.util.NestedServletException Handler dispatch failed;</a>
                        <span class="text-muted">m0_74825260</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>详细异常信息:org.springframework.web.util.NestedServletException:Handlerdispatchfailed;nestedexceptionisjava.lang.NoClassDefFoundError:javax/xml/bind/DatatypeConverteratorg.springframework.web.servlet.Dispa</div>
                    </li>
                    <li><a href="/article/1895859641884143616.htm"
                           title="介绍下pdf打印工具类 JasperPrint" target="_blank">介绍下pdf打印工具类 JasperPrint</a>
                        <span class="text-muted">东方巴黎~Sunsiny</span>
<a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>JasperPrint工具类深度解析JasperPrint是JasperReports框架中实现PDF打印的核心载体类,其本质是填充数据后的可打印报表对象,承担着从模板编译、数据填充到格式输出的全流程控制。以下从7个维度展开深度解析:一、核心定位与生命周期中间态实体角色JasperPrint处于报表生成流程的中间阶段(生命周期模型):JRXML(设计模板)→Jasper(编译模板)→JasperP</div>
                    </li>
                    <li><a href="/article/1895837070484631552.htm"
                           title="深入探索CSS:从基础到高级,解锁网页设计的无限可能" target="_blank">深入探索CSS:从基础到高级,解锁网页设计的无限可能</a>
                        <span class="text-muted">斯~内克</span>
<a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>CSS(层叠样式表)是现代网页设计中不可或缺的一部分,它不仅决定了网页的外观和风格,还极大地影响了用户体验和交互效果。从简单的文本样式到复杂的布局设计,CSS的灵活性和强大功能使其成为前端开发的核心技术之一。本文将从CSS的基础概念出发,逐步深入到高级应用,带你全面了解CSS的魅力和实用性。一、CSS简介:网页设计的基石CSS是一种用于描述HTML或XML文档外观和格式的样式表语言。它的主要作用是</div>
                    </li>
                    <li><a href="/article/1895818543472111616.htm"
                           title="autojs遍历当前页面所有控件_Qt编写控件属性设计器11-导入xml" target="_blank">autojs遍历当前页面所有控件_Qt编写控件属性设计器11-导入xml</a>
                        <span class="text-muted">weixin_39671935</span>

                        <div>一、前言上一篇文章负责把设计好的控件数据导出到了xml文件,本偏文章负责把导出的xml数据文件导入,然后在画布上自动生成对应的控件,Qt内置的xml数据解析功能,非常强大,都封装在QtXml组件中,Qt有个好处就是,封装了众多的各大操作系统平台的功能,尤其是GUI控件,不愧是超大型一站式GUI超市,虽然网络组件不是很强大,但是应付一些基础应用还是绰绰有余的。在导出xml数据的时候,属性列表和值都按</div>
                    </li>
                    <li><a href="/article/1895812616798924800.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><a class="tag" taget="_blank" href="/search/python/1.htm">python</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/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/Python%E5%9F%BA%E7%A1%80/1.htm">Python基础</a><a class="tag" taget="_blank" href="/search/pycharm/1.htm">pycharm</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在Python中读取XML文件可以使用内置的xml.etree.ElementTree模块,它提供了一个轻量级且易于使用的API来解析和创建XML数据。下面是一个基本的示例,展示如何读取XML文件并提取数据。假设我们有一个名为example.xml的XML文件,内容如下:JohnDoe30john.doe@example.comJaneSmith25jane.smith@example.com以下</div>
                    </li>
                    <li><a href="/article/1895805932110147584.htm"
                           title="Spring MVC流程" target="_blank">Spring MVC流程</a>
                        <span class="text-muted">zhujilisa</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>
                        <div>SpringMVC启动流程启动流程父子容器请求处理MultipartFile解析参数传递返回值处理HandlerInterceptor启动流程启动Tomcat解析web.xml创建DispatcherServlet调用DIspatcherServlet的init方法4.1创建Spring容器4.2发布ContextRefresheEvent4.3在OnRefreshed方法中触发initStrat</div>
                    </li>
                    <li><a href="/article/1895796602124169216.htm"
                           title="用idea创建低版本springboot2.X的项目" target="_blank">用idea创建低版本springboot2.X的项目</a>
                        <span class="text-muted">詹皇wm</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/intellij-idea/1.htm">intellij-idea</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>文章目录我的环境:创建项目:进入创建项目页面:进入Springboot版本选择和添加依赖页面进入项目打开pom.xml![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f9243eb285394e38929a5fc145bed81d.png)*补充*_本文章主要是对于现在idea配置大部分都是自带SpringBoot3.X,怎么创建低版本springboo</div>
                    </li>
                    <li><a href="/article/1895795215093002240.htm"
                           title="HTML---css选择器" target="_blank">HTML---css选择器</a>
                        <span class="text-muted">lh_freak</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>CSS指层叠样式表,是一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言,CSS文件扩展名为.css。使用CSS我们可以大大提升网页开发的工作效率!插入样式表的方法有三种:外部样式(Externalstylesheet)内部样式(Internalstylesheet)内联样式(Inlinestyle)内联样式(行内样式)hello样式直接写入到本元素标签中</div>
                    </li>
                    <li><a href="/article/1895768628591128576.htm"
                           title="python爬虫系列课程4:一个例子学会使用xpath语法" target="_blank">python爬虫系列课程4:一个例子学会使用xpath语法</a>
                        <span class="text-muted">wp_tao</span>
<a class="tag" taget="_blank" href="/search/Python%E5%89%AF%E4%B8%9A%E6%8E%A5%E5%8D%95%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/1.htm">Python副业接单实战项目</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>python爬虫系列课程4:一个例子学会使用xpath语法本文通过一个例子,学会xpath的各种语法,可以作为xpath的查询手册使用,代码如下:fromlxmlimportetreetext='''firstitemseconditemthirditemfourthitem<liclass="item-0</div>
                    </li>
                    <li><a href="/article/1895763839211859968.htm"
                           title="Spring Boot整合FTP实现文件的上传和下载" target="_blank">Spring Boot整合FTP实现文件的上传和下载</a>
                        <span class="text-muted">anhao78</span>
<a class="tag" taget="_blank" href="/search/ftp%E5%AE%9E%E7%8E%B0%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%8A%E4%BC%A0%E5%92%8C%E4%B8%8B%E8%BD%BD/1.htm">ftp实现文件的上传和下载</a>
                        <div>第一步:pom.xml文件中引入依赖包   commons-net   commons-net   3.3第二步:编写ftp上传文件工具类packagecom.split.ftp;importlombok.Data;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.net.ftp.*;importorg.springframework</div>
                    </li>
                    <li><a href="/article/1895724124584603648.htm"
                           title="WPS 加载项开发说明" target="_blank">WPS 加载项开发说明</a>
                        <span class="text-muted">金山办公开发者</span>
<a class="tag" taget="_blank" href="/search/JSAPI%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91/1.htm">JSAPI二次开发</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>WPS加载项结构WPS加载项由自定义功能区和网页两部分组成。自定义功能区只需要一个配置文件,对应WPS加载项目录中的ribbon.xml文件;网页部分负责执行自定义功能区对应的逻辑功能。因为不需要显示网页,所以省略了HTML文件,并用main.js来引入所有的外部JavaScript文件;在这些JavaScript文件中通常包含了一系列用JavaScript实现的函数,这些函数与自定义功能区的功能</div>
                    </li>
                    <li><a href="/article/1895674192532140032.htm"
                           title="《OpenCV》——人脸检测" target="_blank">《OpenCV》——人脸检测</a>
                        <span class="text-muted">Kai HVZ</span>
<a class="tag" taget="_blank" href="/search/opencv/1.htm">opencv</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a>
                        <div>人脸检测级联分离器具体实现实例(人脸检测)本实例对合照图片进行人脸检测,并圈出人脸位置,使用的OpenCV自带的级联分类器可从OpenCV源文件的data目录下,加载不同的级联分类器的XML文件对不同对象的检测。代码实现python#导入OpenCV库,用于计算机视觉任务,如读取图像、图像处理和显示图像等importcv2#使用cv2.imread函数读取指定路径下的图像文件'hezhao.jpg</div>
                    </li>
                    <li><a href="/article/1895660450805248000.htm"
                           title="python爬取arXiv论文元数据" target="_blank">python爬取arXiv论文元数据</a>
                        <span class="text-muted">小孔不爱coding</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/1.htm">网络爬虫</a>
                        <div>需要相关学科、主题的论文元数据做一些分析,arXiv开源,容易获取。显示选择了考虑用arXiv的api去实现,相关手册见arXiv-api但貌似每次我都被卡在3000条数据就停止了,所以我选择用传统的lxml,bs4直接爬取,但仍然被限制爬取10000条。直接上完整代码,后面解释fromlxmlimporthtmlimportrequestsimportreimportmathimportcsvf</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>