整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

第53期Java面试题:XML和HTML的区别、XM

第53期Java面试题:XML和HTML的区别、XML文档定义、java反射机制

、XML和HTML的区别?

1)设计上的区别:XML用来存储数据,重点在于数据本身,HTML用来定义数据,重在数据的显示模式。

2)XML可扩展性强,因为他本身就是可拓展性标记语言,课创建个性化的标记语言,提供更多数据操作。

3)XML语法比HTML严格。

4)起始标签和结束标签要匹配

5)嵌套标签不能相互嵌套

6)区分大小写

7)XML属性必须放在引号中,HTML可有可无。

8)XML必须有相应值,但HTML可以有不带属性的属性名。

2、XML文档定义有几种形式?它们之间有何本质区别?

1)两种形式 dtd schema。

2)本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),

3、什么是java反射机制?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

入dll

1.通过NuGet安装dll(2种方法)

1.1可以在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“管理NuGet包”,然后搜索“Free Spire.Doc”,点击“安装”。等待程序安装完成。

1.2将以下内容复制到PM控制台安装:

Install-Package FreeSpire.Doc -Version 10.2

2.手动添加dll引用

可通过手动下载包到本地,然后解压,找到BIN文件夹下的Spire.Doc.dll。然后在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“添加引用”,将本地路径BIN文件夹下的dll文件添加引用至程序。


将HTML转为XML

转换时,可参考如下代码来进行:

  1. 创建Document类的对象。
  2. 调用Document.LoadFromFile(string fileName, FileFormat fileFormat)方法加载HTML文档。
  3. 通过Document.SaveToFile(string fileName, FileFormat fileFormat)方法保存为XML格式到指定路径。

C#

using Spire.Doc;

namespace HTMLtoXML
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建Document类的对象
            Document doc=new Document();

            //加载html文件
            doc.LoadFromFile("sample.html",FileFormat.Html);

            //保存为XML格式
            doc.SaveToFile("HTMLtoXML.xml", FileFormat.Xml);
            System.Diagnostics.Process.Start("HTMLtoXML.xml");
        }
    }
}

转换效果:

—End—

、安装

XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历。

pip install lxml

二、使用案例

from lxml import etree
import requests
import asyncio
import functools
import re
import json

house_info=[]

'''异步请求获取链家每页数据'''
async def get_page(page_index):
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
    }
    request=functools.partial(requests.get, f'https://sh.lianjia.com/ershoufang/pudong/pg{page_index}/',
                                headers=headers)
    loop=asyncio.get_running_loop()
    response=await loop.run_in_executor(None, request)
    return response

'''使用xpath获取房屋信息'''
def get_house_info(html):
    title_list=html.xpath('//a[@data-el="ershoufang"]/text()')  # 房屋title
    house_pattern_list=html.xpath('//div[@class="houseInfo"]/text()')  # 房屋格局
    price_list=html.xpath('//div[@class="unitPrice"]/span/text()')  # 房屋单价
    location_list=html.xpath('//div[@class="positionInfo"]')  # 房屋位置信息
    total_list=html.xpath('//div[contains(@class,"totalPrice")]')  # 总价

    for index, item in enumerate(zip(title_list, house_pattern_list, price_list)):
        location_item=location_list[index]
        total_item=total_list[index]
        house_info.append({
            'title': item[0],
            'house_pattern': item[1],
            'price': item[2],
            'location': location_item.xpath('./a[1]/text()')[0] + location_item.xpath('./a[last()]/text()')[0],
            'total': total_item.xpath('./span/text()')[0] + total_item.xpath('./i[last()]/text()')[0]
        })

'''异步获取第一页数据,拿到第一页房屋信息,并返回分页总数和当前页'''
async def get_first_page():
    response=await get_page(1)
    #etree.HTML 将获取到的html字符串转为可操作的Element对象
    get_house_info(etree.HTML(response.text))

if __name__=='__main__':
    asyncio.run(get_first_page())

三、etree 模块

  1. etree.Element(element_name, attrib=None, nsmap=None) 创建element对象
from lxml import etree
'''
element_name:要创建的元素的名称
attrib:元素的属性字典
nsmap:命名空间映射字典,用于指定元素的命名空间
'''
element=etree.Element('div',attrib={'class':'test'},nsmap={"ns": "http://example.com/ns"})
  1. etree.SubElement(parent, element_name, attrib=None, nsmap=None) 创建子元素
from lxml import etree
'''
parent:element对象
element_name:要创建的元素的名称
attrib:元素的属性字典
nsmap:命名空间映射字典,用于指定元素的命名空间
'''
element=etree.Element('div', attrib={'class': 'test'}, nsmap={"ns": "http://example.com/ns"})
span_element=etree.SubElement(element,'span')
span_element.text='我是span'
print(element.xpath('//div/span/text()'))
  1. etree.fromstring(text, parser=None,base_url=None) 将XML、HTML字符串解析为Element对象
from lxml import etree

'''
text:解析的XML字符串
parse:解析器对象,默认lxml.etree.XMLParser、lxml.etree.HTMLParser
base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
'''
html_str='<div class="test"><span>我是span</span></div>'
element=etree.fromstring(html_str)
print(element.xpath('//div/span/text()'))
  1. etree.HTML(text, parser=None, base_url=None) 将HTML字符串解析为Element对象
from lxml import etree

'''
xml_string:解析的XML字符串
parse:解析器对象,默认lxml.etree.HTMLParser
base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
'''
html_str='<div class="test"><span>我是span</span></div>'
element=etree.HTML(html_str)
print(element.xpath('//div/span/text()'))
  1. etree.XML(text, parser=None, base_url=None) 将XML字符串解析为Element对象
from lxml import etree

'''
text:解析的XML字符串
parse:解析器对象,默认lxml.etree.XMLParser
base_url: 基本URL,用于解析相对URL。如果HTML文档中包含相对URL,解析器将使用base_url来将其转换为绝对URL。如果未提供base_url,则相对URL将保持不变
'''
html_str='<div class="test"><span>我是span</span></div>'
element=etree.XML(html_str)
print(element.xpath('//div/span/text()'))
  1. etree.parse(source, parser=None, base_url=None) 将XML、HTML字符串解析为ElementTree对象

四、element 对象

  1. element.xpath(path) 执行xpath语法
  2. element.nsmap:获取或设置元素命名空间映射
  3. element.attrib:获取或设置元素属性
  4. element.text:获取或设置文本
  5. element.tag:返回对象名称
  6. element.append(element) 向节点里面追加子节点
  7. element.insert(index,element) 向节点开始的某个位置添加子节点
from lxml import etree

element=etree.Element('div', attrib={'class': 'test'})
span_element=etree.SubElement(element, 'span')
span_element.text='我是span'append_child=etree.Element('div', attrib={'class': 'append'})
append_child.text='我是append_child'insert_child=etree.Element('div', attrib={'class': 'insert'})
insert_child.text='我是insert_child'element.append(append_child)
element.insert(0,insert_child)
print(element.xpath('//div/span/text()'))
print(element.xpath('//div/div[@class="append"]/text()'))
print(element.xpath('//div/div[@class="insert"]/text()'))
  1. element.find(xpath): 在元素的子树中查找与XPath表达式匹配的第一个元素,并返回该元素。如果找不到匹配的元素,则返回None
  2. element.findall(xpath): 在元素的子树中查找与XPath表达式匹配的所有元素,并返回一个列表
  3. element.get(attribute_name, default=None): 获取元素的指定属性的值
  4. element.set(attribute_name, value): 设置元素的指定属性的值
  5. element.iter(tag=None): 迭代元素及其子元素,可选择指定标签进行过滤
  6. element.getparent(): 获取元素的父元素
  7. element.getchildren(): 获取元素的所有子元素
  8. element.getroottree(): 获取包含元素的根元素的Tree对象

五、elementTree 对象

  1. elementTree.root: 根元素的Element对象。可以通过访问tree.root来获取根元素。
  2. elementTree.getroot(): 获取根元素的Element对象。与tree.root属性相同,用于获取根元素
  3. elementTree.find(path): 在整个文档中查找具有指定路径的第一个元素,并返回该元素的Element对象。路径可以使用XPath表达式指定
  4. elementTree.findall(path): 在整个文档中查找具有指定路径的所有元素,并返回这些元素的列表。路径可以使用XPath表达式指定
  5. elementTree.iterfind(path): 在整个文档中迭代查找具有指定路径的元素,并返回这些元素的迭代器。路径可以使用XPath表达式指定
  6. elementTree.write(file, encoding=None, xml_declaration=None, pretty_print=False): 将整个文档写入文件。file参数可以是文件名或文件对象。encoding参数指定写入文件时使用的字符编码。xml_declaration参数指定是否写入XML声明。pretty_print参数指定是否以更易读的格式写入文档
  7. elementTree.tostring(element, encoding=None, method="xml", pretty_print=False): 将指定元素及其子元素序列化为字符串。element参数是要序列化的元素。encoding参数指定字符串的字符编码。method参数指定序列化的方法,可以是"xml"(默认)或"html"。pretty_print参数指定是否以更易读的格式序列化。
  8. elementTree.parse(source, parser=None, base_url=None): 静态方法,用于解析XML或HTML文档并返回一个ElementTree对象。与etree.parse函数的用法相同

六、parse 解析器对象

  1. lxml.etree.XMLParser: 用于解析XML文档的默认解析器。它支持标准的XML解析,并提供了丰富的功能和选项,如命名空间支持、DTD验证等。
  2. lxml.etree.HTMLParser: 用于解析HTML文档的默认解析器。它专门针对HTML进行了优化,并具有处理HTML特性的功能,如自动修复破碎的标签、处理实体引用等。
  3. lxml.etree.XMLPullParser: 一种事件驱动的解析器,用于逐行解析XML文档。它提供了一个迭代器接口,可以逐行读取和处理XML文档。
  4. lxml.etree.HTMLPullParser: 一种事件驱动的解析器,用于逐行解析HTML文档。它提供了一个迭代器接口,可以逐行读取和处理HTML文档。