• [技术干货] Setting.xml文件详解
    1. 总体结构<!--声明语句--> <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!-- 本地仓库的路径。默认值为${user.home}/.m2/repository。 --> <localRepository>usr/local/maven</localRepository>    <!--Maven是否需要和用户交互以获得输入。需要设置成true,否则false。默认true。--> <interactiveMode>true</interactiveMode> <!--Maven是否需要使用plugin-registry.xml文件来管理插件版本。如果需要让Maven使用文件${user.home}/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为 false。--> <usePluginRegistry>false</usePluginRegistry> <!--表示Maven是否需要在离线模式下运行。需要则为true,默认为false。一般应用于网络不通或者出于其它安全考虑 --> <offline>false</offline> <!--当插件的组织Id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我 们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo --> <pluginGroups> <!--plugin的组织Id(groupId) -->   <pluginGroup>org.codehaus.mojo</pluginGroup> </pluginGroups> <!--配置不同的代理,多代理profiles 可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。 很少用到--> <proxies> <proxy> <!--唯一标识--> <id>myproxy</id> <!--true则激活此代理 --> <active>true</active> <!--代理的协议--> <protocol>http</protocol> <!--代理的主机名--> <host>proxy.somewhere.com</host> <!--代理的端口--> <port>8080</port> <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 --> <username>proxyuser</username> <!--代理的密码--> <password>somepassword</password> <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。--> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies> <!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。--> <servers> <server> <!--该id与distributionManagement中repository元素的id相匹配。--> <id>server001</id> <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 --> <username>my_login</username> <!--鉴权密码 密码加密功能已被添加到2.1.0 +。详情请访问密码加密页面--> <password>my_password</password> <!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是${user.home}/.ssh/id_dsa)以及如果需要的话,一个密语。将来passphrase和password元素可能会被提取到外部,但目前它们必须在settings.xml文件以纯文本的形式声明。 --> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <!--鉴权时使用的私钥密码。--> <passphrase>some_passphrase</passphrase> <!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 --> <filePermissions>664</filePermissions> <!--目录被创建时的权限。 --> <directoryPermissions>775</directoryPermissions> </server> </servers> <!--为仓库列表配置的下载镜像列表。高级设置请参阅镜像设置页面 --> <mirrors> <mirror> <!--唯一标识符,区分不同的mirror元素 --> <id>planetmirror.com</id> <!--镜像名称 --> <name>PlanetMirror Australia</name> <!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL,就是下载jar包的路径 --> <url>http://downloads.planetmirror.com/pub/maven2</url> <!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓 库的id central完全一致。--> <mirrorOf>central</mirrorOf> </mirror> </mirrors> <!--根据环境参数来调整构建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。这里的profile元素只关心构建系统这个整体,而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。 --> <profiles> <profile> <!--唯一标识--> <id>test</id> <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。--> <activation> <!--默认是否激活该profile--> <activeByDefault>false</activeByDefault> <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。--> <jdk>1.5</jdk> <!--当存在匹配的操作系统属性,profile被激活。一般不使用--> <os> <!--激活profile的操作系统的名字 --> <name>Windows 7</name> <!--激活profile的操作系统所属家族(如 'windows') --> <family>Windows</family> <!--激活profile的操作系统体系结构 --> <arch>x64</arch> <!--激活profile的操作系统版本--> <version>5.1.2600</version> </os> <!--如果Maven检测到某一个xml节点等于下面name的值,并且该节点的值等于下面value的值。那么激活这个profile。如果值字段是空的,那么存在属性名称字段就会激活--> <![CDATA[比如根据下面的配置,当存在<mavenVersion>2.0.3</mavenVersion>节点时将激活此profile]]> <property> <!--激活profile的属性的名称--> <name>mavenVersion</name> <!--激活profile的属性的值 --> <value>2.0.3</value> </property> <!--提供一个文件名,通过检测该文件的存在与否来激活profile--> <file> <!--如果指定的文件存在,则激活profile。 --> <exists>${basedir}/file2.properties</exists> <!--如果指定的文件不存在,则激活profile。--> <missing>${basedir}/file1.properties</missing> </file> </activation> <!--对应profile的自定义属性列表。Maven属性和Ant中的属性一样,可以用来存放一些值。这些值可以在POM中的任何地方使用标记${X}来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。 1. env.X: 在一个变量前加上"env."的前缀,会返回一个shell环境变量。例如,"env.PATH"指代了$path环境变量(在Windows上是%PATH%)。 2. project.x:指代了POM中对应的元素值。例如: <project><version>1.0</version></project>通过${project.version}获得version的值。 3. settings.x: 指代了settings.xml中对应元素的值。例如:<settings><offline>false</offline></settings>通过 ${settings.offline}获得offline的值。 4. Java System Properties: 所有可通过java.lang.System.getProperties()访问的属性都能在POM中使用该形式访问,例如 ${java.home}。 5. x: 在<properties/>元素中,或者外部文件中设置,以${someVar}的形式使用。 --> <!--当该profile被激活,则可以再POM中使用${user.install}。--> <properties> <user.install>${user.home}/our-project</user.install> </properties> <!--远程仓库列表,它是Maven用来填充构建系统本地仓库所使用的一组远程项目。 --> <repositories> <!--包含需要连接到远程仓库的信息 --> <repository> <!--远程仓库唯一标识--> <id>codehausSnapshots</id> <!--远程仓库名称 --> <name>Codehaus Snapshots</name> <!--如何处理远程仓库里发布版本的下载--> <releases> <!--true或者false表示该仓库是否开启下载--> <enabled>false</enabled> <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),never(从不)。 --> <updatePolicy>always</updatePolicy> <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。--> <checksumPolicy>warn</checksumPolicy> </releases> <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。--> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <!--远程仓库URL,按protocol://hostname/path形式 --> <url>http://snapshots.maven.codehaus.org/maven2</url> <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven2为其仓库提供了一个默认的布局;Maven1.x有一种遗留布局。我们可以使用该元素指定布局是default还是legacy--> <layout>default</layout> </repository> </repositories> <!--发现插件的远程仓库列表。仓库是两种主要构件的家。第一种构件被用作其它构件的依赖。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件。Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。--> <pluginRepositories> <!--参见profiles/profile/repositories/repository元素的说明--> <pluginRepository> <releases> <enabled/><updatePolicy/><checksumPolicy/> </releases> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <id/><name/><url/><layout/> </pluginRepository> </pluginRepositories> </profile> </profiles> <!--手动激活profiles的列表,按照activeProfile的定义顺序激活并应用profiles。如果没有匹配的profile,则什么都不会发生,Maven则会像往常一样运行--> <activeProfiles> <activeProfile>env-test</activeProfile> </activeProfiles> </settings>2. 具体结构2.1 proxies代理<!--配置不同的代理,多代理profiles 可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。 很少用到--> <proxies> <proxy> <!--唯一标识--> <id>myproxy</id> <!--true则激活此代理 --> <active>true</active> <!--代理的协议--> <protocol>http</protocol> <!--代理的主机名--> <host>proxy.somewhere.com</host> <!--代理的端口--> <port>8080</port> <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。 --> <username>proxyuser</username> <!--代理的密码--> <password>somepassword</password> <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。--> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies>2.2 servers服务端的配置<!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。--> <servers> <server> <!--该id与distributionManagement中repository元素的id相匹配。--> <id>server001</id> <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 --> <username>my_login</username> <!--鉴权密码 密码加密功能已被添加到2.1.0 +。详情请访问密码加密页面--> <password>my_password</password> <!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是${user.home}/.ssh/id_dsa)以及如果需要的话,一个密语。将来passphrase和password元素可能会被提取到外部,但目前它们必须在settings.xml文件以纯文本的形式声明。 --> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <!--鉴权时使用的私钥密码。--> <passphrase>some_passphrase</passphrase> <!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 --> <filePermissions>664</filePermissions> <!--目录被创建时的权限。 --> <directoryPermissions>775</directoryPermissions> </server> </servers>2.3 mirrors镜像库<!--为仓库列表配置的下载镜像列表。高级设置请参阅镜像设置页面 --> <mirrors> <mirror> <!--唯一标识符,区分不同的mirror元素 --> <id>planetmirror.com</id> <!--镜像名称 --> <name>PlanetMirror Australia</name> <!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL,就是下载jar包的路径 --> <url>http://downloads.planetmirror.com/pub/maven2</url> <!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓 库的id central完全一致。--> <mirrorOf>central</mirrorOf> </mirror> </mirrors>2.4 profile 构建配置<!--根据环境参数来调整构建配置的列表。settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。这里的profile元素只关心构建系统这个整体,而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。 --> <profiles> <profile> <!--唯一标识--> <id>test</id> <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。--> <activation> <!--默认是否激活该profile--> <activeByDefault>false</activeByDefault> <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。--> <jdk>1.5</jdk> <!--当存在匹配的操作系统属性,profile被激活。一般不使用--> <os> <!--激活profile的操作系统的名字 --> <name>Windows 7</name> <!--激活profile的操作系统所属家族(如 'windows') --> <family>Windows</family> <!--激活profile的操作系统体系结构 --> <arch>x64</arch> <!--激活profile的操作系统版本--> <version>5.1.2600</version> </os> <!--如果Maven检测到某一个xml节点等于下面name的值,并且该节点的值等于下面value的值。那么激活这个profile。如果值字段是空的,那么存在属性名称字段就会激活--> <![CDATA[比如根据下面的配置,当存在<mavenVersion>2.0.3</mavenVersion>节点时将激活此profile]]> <property> <!--激活profile的属性的名称--> <name>mavenVersion</name> <!--激活profile的属性的值 --> <value>2.0.3</value> </property> <!--提供一个文件名,通过检测该文件的存在与否来激活profile--> <file> <!--如果指定的文件存在,则激活profile。 --> <exists>${basedir}/file2.properties</exists> <!--如果指定的文件不存在,则激活profile。--> <missing>${basedir}/file1.properties</missing> </file> </activation> <!--对应profile的自定义属性列表。Maven属性和Ant中的属性一样,可以用来存放一些值。这些值可以在POM中的任何地方使用标记${X}来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。 1. env.X: 在一个变量前加上"env."的前缀,会返回一个shell环境变量。例如,"env.PATH"指代了$path环境变量(在Windows上是%PATH%)。 2. project.x:指代了POM中对应的元素值。例如: <project><version>1.0</version></project>通过${project.version}获得version的值。 3. settings.x: 指代了settings.xml中对应元素的值。例如:<settings><offline>false</offline></settings>通过 ${settings.offline}获得offline的值。 4. Java System Properties: 所有可通过java.lang.System.getProperties()访问的属性都能在POM中使用该形式访问,例如 ${java.home}。 5. x: 在<properties/>元素中,或者外部文件中设置,以${someVar}的形式使用。 --> <!--当该profile被激活,则可以再POM中使用${user.install}。--> <properties> <user.install>${user.home}/our-project</user.install> </properties> <!--远程仓库列表,它是Maven用来填充构建系统本地仓库所使用的一组远程项目。 --> <repositories> <!--包含需要连接到远程仓库的信息 --> <repository> <!--远程仓库唯一标识--> <id>codehausSnapshots</id> <!--远程仓库名称 --> <name>Codehaus Snapshots</name> <!--如何处理远程仓库里发布版本的下载--> <releases> <!--true或者false表示该仓库是否开启下载--> <enabled>false</enabled> <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),never(从不)。 --> <updatePolicy>always</updatePolicy> <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。--> <checksumPolicy>warn</checksumPolicy> </releases> <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。--> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <!--远程仓库URL,按protocol://hostname/path形式 --> <url>http://snapshots.maven.codehaus.org/maven2</url> <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven2为其仓库提供了一个默认的布局;Maven1.x有一种遗留布局。我们可以使用该元素指定布局是default还是legacy--> <layout>default</layout> </repository> </repositories> <!--发现插件的远程仓库列表。仓库是两种主要构件的家。第一种构件被用作其它构件的依赖。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件。Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。--> <pluginRepositories> <!--参见profiles/profile/repositories/repository元素的说明--> <pluginRepository> <releases> <enabled/><updatePolicy/><checksumPolicy/> </releases> <snapshots> <enabled/><updatePolicy/><checksumPolicy/> </snapshots> <id/><name/><url/><layout/> </pluginRepository> </pluginRepositories> </profile> </profiles>2.5 activeProfiles指定激活的配置<!--手动激活profiles的列表,按照activeProfile的定义顺序激活并应用profiles。如果没有匹配的profile,则什么都不会发生,Maven则会像往常一样运行--> <activeProfiles> <activeProfile>env-test</activeProfile> </activeProfiles>
  • [技术干货] python将xml文件转换为字典
    python将xml文件转换为字典使用xmltodict模块。vi demo.pyimport xmltodictf = open('files/products.xml','rt',encoding='utf-8')xml = f.read()d = xmltodict.parse(xml)#print(d)for v in d['root']['products']['product']:    print('uuid',':',v['@uuid'])    print('id',':',v['id'])    print('name',':',v['name'])    print('price',':',v['price'])    print('---------')print(d['root']['products']['product'][0]['@uuid'])import pprint    #引入pprint模块可读格式化输出字典数据pp = pprint.PrettyPrinter(indent=4)pp.pprint(d)使用cloudIDE运行demo.py:user@u4ft68gtp8ygqp8-machine:~/sdfsadf-1635320736190$ /usr/bin/python /home/user/sdfsadf-1635320736190/demo.pyuuid : 1234id : 10000name : iPhone9price : 9999---------uuid : 4321id : 20000name : 特斯拉price : 1000000---------uuid : 5678id : 30000name : Mac Proprice : 40000---------1234OrderedDict([   (   'root',                    OrderedDict([   (   'products',                                        OrderedDict([   (   'product',                                                            [   OrderedDict([   (   '@uuid',                                                                                    '1234'),                                                                                (   'id',                                                                                    '10000'),                                                                                (   'name',                                                                                    'iPhone9'),                                                                                (   'price',                                                                                    '9999')]),                                                                OrderedDict([   (   '@uuid',                                                                                    '4321'),                                                                                (   'id',                                                                                    '20000'),                                                                                (   'name',                                                                                    '特斯拉'),                                                                                (   'price',                                                                                    '1000000')]),                                                                OrderedDict([   (   '@uuid',                                                                                    '5678'),                                                                                (   'id',                                                                                    '30000'),                                                                                (   'name',                                                                                    'Mac '                                                                                    'Pro'),                                                                                (   'price',                                                                                    '40000')])])]))]))])user@u4ft68gtp8ygqp8-machine:~/sdfsadf-1635320736190$ 
  • [技术干货] python将字典转换为xml
    python将字典数据转换为XML字符串;用到dicttoxml模块,需要安装后使用。dict -> xml字符串,格式化xml字符串,然后写入到persons.xml文件当中。vi demo.pyimport dicttoxmlfrom xml.dom.minidom import parseStringimport os# 定义一个字典数组d = [20,'names',{'name':'Bill','age':30,'salary':2000},                {'name':'李宁','age':123,'salary':20004},                {'name':'John','age':20,'salary':1234}] # 将字典转换为XML格式(bytes形式)bxml = dicttoxml.dicttoxml(d, custom_root = 'persons') #模块中的同名函数#print(bxml)xml = bxml.decode('utf-8') #将代码使用utf-8解析#print(xml)# 解析xml字符串为可读的格式化输出dom = parseString(xml)prettyxml = dom.toprettyxml(indent = '    ')print(prettyxml)os.makedirs("files", exist_ok = True)f = open('files/persons.xml','w',encoding='utf-8')f.write(prettyxml)f.close()使用cloudIDE运行demo.py,python环境需要首先安装dicttoxml:user@gwvm2a1fnntuar8-machine:~/sdf-1635319411781$ pip install dicttoxmlDefaulting to user installation because normal site-packages is not writeableLooking in indexes: https://repo.huaweicloud.com/repository/pypi/simpleLooking in links: https://obs-workspace-20180810.obs.cn-north-1.myhuaweicloud.com/pypi/index.htmlCollecting dicttoxml  Downloading https://repo.huaweicloud.com/repository/pypi/packages/74/36/534db111db9e7610a41641a1f6669a964aacaf51858f466de264cc8dcdd9/dicttoxml-1.7.4.tar.gz (18 kB)Building wheels for collected packages: dicttoxml  Building wheel for dicttoxml (setup.py) ... done  Created wheel for dicttoxml: filename=dicttoxml-1.7.4-py3-none-any.whl size=17463 sha256=be43aebf0e7ea56c138ebf2e1bf14f0b15a81fb0155ad8b6ea84d408475b8cf1  Stored in directory: /home/user/.cache/pip/wheels/de/80/18/aecfd193b0578b272c933f413c05b21f693bbc47cb1cc7f1ddSuccessfully built dicttoxmlInstalling collected packages: dicttoxmlSuccessfully installed dicttoxml-1.7.4WARNING: You are using pip version 21.2.4; however, version 21.3 is available.You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.运行demo.pyuser@gwvm2a1fnntuar8-machine:~/sdf-1635319411781$ /usr/bin/python /home/user/sdf-1635319411781/demo.py<?xml version="1.0" ?><persons>    <item type="int">20</item>    <item type="str">names</item>    <item type="dict">        <name type="str">Bill</name>        <age type="int">30</age>        <salary type="int">2000</salary>    </item>    <item type="dict">        <name type="str">李宁</name>        <age type="int">123</age>        <salary type="int">20004</salary>    </item>    <item type="dict">        <name type="str">John</name>        <age type="int">20</age>        <salary type="int">1234</salary>    </item></persons>user@gwvm2a1fnntuar8-machine:~/sdf-1635319411781$ 生成的文件files/person.xml<?xml version="1.0" ?><persons>    <item type="int">20</item>    <item type="str">names</item>    <item type="dict">        <name type="str">Bill</name>        <age type="int">30</age>        <salary type="int">2000</salary>    </item>    <item type="dict">        <name type="str">李宁</name>        <age type="int">123</age>        <salary type="int">20004</salary>    </item>    <item type="dict">        <name type="str">John</name>        <age type="int">20</age>        <salary type="int">1234</salary>    </item></persons>
  • [技术干货] python读取xml文件练习
    products.xml文件内容:<root>    <products>        <product uuid='1234'>            <id>10000</id>            <name>iPhone9</name>            <price>9999</price>        </product>        <product uuid='4321'>            <id>20000</id>            <name>特斯拉</name>            <price>1000000</price>        </product>        <product uuid='5678'>            <id>30000</id>            <name>Mac Pro</name>            <price>40000</price>        </product>            </products></root>vi demo.py# 读取与检索XML文件from xml.etree.ElementTree import parsedoc = parse('products.xml') #读取整个文件的句柄for item in doc.iterfind('products/product'): #解析单个产品    # 读取id节点的值    id = item.findtext('id')    # 读取name节点的值    name = item.findtext('name')    # 读取price节点的值    price = item.findtext('price')        #uuid = item.get('uuid')    print('uuid','=', item.get('uuid'))    print('id','=',id)    print('name','=',name)    print('price','=',price)    print('-----------------')    使用cloudIDE运行结果:user@a2ns6m9d57dyrps-machine:~/sdf-1635317644253$ /usr/bin/python /home/user/sdf-1635317644253/demo.pyuuid = 1234id = 10000name = iPhone9price = 9999-----------------uuid = 4321id = 20000name = 特斯拉price = 1000000-----------------uuid = 5678id = 30000name = Mac Proprice = 40000-----------------user@a2ns6m9d57dyrps-machine:~/sdf-1635317644253$ 
  • [应用安全] 【漏洞通告】Oracle MySQL JDBC XML外部实体注入漏洞 CVE-2021-2471
    漏洞名称 : Oracle MySQL JDBC XML外部实体注入漏洞 CVE-2021-2471组件名称 : Oracle MySQL影响范围 : Oracle MySQL < 8.0.27漏洞类型 : XML外部实体注入利用条件 : 未知综合评价 : <综合评定利用难度>:未知。<综合评定威胁等级>:高危,能获取敏感信息。漏洞分析:1、组件介绍MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle旗下产品。MySQL 是当前流行的关系型数据库管理系统之一。2、漏洞描述2021年10月21日,监测到一则Oracle MySQL组件在JDBC过程中存在XML外部实体注入漏洞的信息,漏洞编号:CVE-2021-2471,漏洞威胁等级:高危。攻击者可以利用该漏洞获取服务器敏感信息,最终导致信息泄露。影响范围:MySQL 是当前流行的关系型数据库管理系统之一,所提供的服务和产品众多且应用广泛。此次可能受漏洞影响的资产也分布于世界各地,中国地区也使用广泛。目前受影响的Oracle MySQL版本:Oracle MySQL < 8.0.27解决方案:1、官方修复建议当前官方已发布对应安全补丁,建议受影响用户及时更新。参考链接如下:https://www.oracle.com/security-alerts/cpuoct2021.html
  • [技术干货] 浅析NETCONF\YANG\XML的关系
    netconf 是基于xml的网络配置协议,提供了安装,操作和删除网络设备配置的机制。yang 是为netconf建模的一种数据建模语言。xml 指可扩展标记语言,被设计用来传输和存储数据,是一种树状的数据格式。对于常规网络配置问题,比如要给一台路由器配置一条命令,常规的方法是连上去输入命令进行配置。netconf的作用就是代替这个过程完成网络自动化配置,每次你将需要的配置数据告诉netconf,它就会完成配置。但是问题是网络设备的配置模型是不一样的。如果能够给定一个固定的模型,并利用该模型将配置数据进行解析,转换为符合要求的数据结构,就可以完成自动化配置了。yang语言的作用就是设置这个固定模型即yang模型。netconf的信息交互就是用xml来实现的,所以yang模型其实就是一种描述XML结构的模型。
  • [技术干货] java打包2
    在进入正题之前,你要先打开我们刚刚做好的jar包看看,多了什么呢,META-INF目录?再看看里面是什么,还有一个MANIFEST.MF文件是不是?用文本编辑器(我这里是UltraEdit)打开它看看:  Manifest-Version: 1.0   Created-By: 1.4.2 (Sun Microsystems Inc.)    就是这样。这里我们对它进行修改,加一句:Main-Class: HelloWorld (在第三行)。这个就是我们之前写的那个类,也就是我们的入口类。也即,  Manifest-Version: 1.0   Created-By: 1.4.2 (Sun Microsystems Inc.)   Main-Class: HelloWorld    接下来,我们在命令提示符里执行:  jar  umf  MANIFEST.MF  app.jar  (应该是hello.jar吧)   这样我们使用了我们自己的MANIFEST.MF文件对原来默认的进行了更新。你不妨可以再进去看看是不是添上了Main-Class: HelloWorld这一句。    (是吗,我怎么没试出来,提示java.io.FileNotFoundException:MANIFEST.MF(系统找不到指定的文件)怎么回事?) Ok,这个最后的一步了,来验证我们做的一切,在命令提示符中输入:  java -jar hello.jar(执行)    出现了什么, Hi, Hello World!    我们再来看看jar文件在tomcat中发布,注意:在tomcat中我们就不能再用jar这种格式,而改war格式,它是专门用于web应用的,其实整个过程下来基本上和jar是类似的:   先准备我们要打包的资源。     找到存放tomcat的webapps目录,进到其中,新建一个文件夹,这里命名为hello,再进去新建WEB-INF文件夹,再进去新建classes文件夹,此时我们也将我们唯一的servlet,HelloWorld.java放到这里,在与classes目录同级下建立一文件web.xml。Ok,目前我们初步建立了一个简单的web应用。    这是HelloWorld.java:     import java.io.*;   import javax.servlet.*;   import javax.servlet.http.*;   public class HelloWorld extends HttpServlet {   public void doGet(HttpServletRequest req, HttpServletResponse res)   throws ServletException, IOException {   res.setContentType("text/html");   PrintWriter out = res.getWriter();   out.println("");   out.println("");   out.println("");   out.println("Hello, World!");   out.println("");   }   }//end here!    对它编译。下面是web.xml:   <?xml version="1.0" encoding="UTF-8"?>   <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">   <web-app>   <servlet>   <servlet-name>hello</servlet-name>   <servlet-class>HelloWorld</servlet-class>   </servlet>   <servlet-mapping>   <servlet-name>hello</servlet-name>   <url-pattern>/HelloWorld</url-pattern>   </servlet-mapping>   </web-app>  在命令提示符下进到先前创制的hello目录下,执行 jar cvf hello.war * ,我们便得到hello.war。将它拷贝至webapps目录下,ok,来看最后一步,打开tomcat的目录conf中的server.xml,加入:  <Context path="/hello" docBase="hello.war" debug="0" reloadable="true"/>   大功告成!运行它,启动tomcat,后在浏览器中输入http://localhost:8080/hello/HelloWorld,有了吗?   最后,如果你想用ant来完成以上的打包活动,下面就告诉你:   对于jar来说。在build.xml中,  <target name="jar">   <jar destfile="${app_home}/hello.jar">   <fileset dir="${dest}" includes="**"/>   <!--fileset dir="${dest}" includes="**/action.properties"/-->   </jar>   </target>     对于war,  <war warfile="hello.war" webxml="./WEB-INF/web.xml">   <fileset dir="html"/>   <lib dir="lib/">   <exclude name="oracle*.jar"/>   </lib>   <classes dir="build/servlets">   <include name="**/*.class"/>   </classes>   </war>     好了,就这么多,希望对你有点帮助。:)  补充:   jar基本操作:     1. 创建jar文件    jar cf jar-file input-file(s)   c---want to Create a JAR file.   f---want the output to go to a file rather than to stdout.   eg: 1)jar cf myjar.jar query_maintain_insert.htm   2)jar cvf myjar.jar query_maintain_insert.htm   v---Produces verbose(详细的) output.  3)jar cvf myjar.jar query_maintain_insert.htm mydirectory   4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory   0---don't want the JAR file to be compressed.   5)jar cmf MANIFEST.MF myjar.jar yahh.txt   m---Used to include manifest information from an existing manifest file.   6)jar cMf MANIFEST.MF myjar.jar yahh.txt   M---the default manifest file should not be produced.   7)jar cvf myjar.jar *   *---create all contents in current directory.   2. 察看jar文件     jar tf jar-file   t---want to view the Table of contents of the JAR file.   eg: 1)jar vft yahh.jar   v---Produces verbose(详细的) output.    3. 提取jar文件    jar xf jar-file [archived-file(s)]   x---want to extract files from the JAR archive.   eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt)  2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文件yahhalex.txt)    3)jar xf yahh.jar(提取该jar包中的所有文件或目录)    4. 修改Manifest文件    jar cmf manifest-addition jar-file input-file(s)   m---Used to include manifest information from an existing manifest file.    5. 更新jar文件    jar uf jar-file input-file(s)   u---want to update an existing JAR file.
  • [互动交流] obs sdk 请求列表数据返回的是 xml?
    我用 `SDK` 的 `listObjects` API去获取文件列表的时候,发现返回的 `response` 是 `XML` 的格式,有配置项可以设置成返回 `json` 的吗? ![WechatIMG3548.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202105/21/174909b3yuvkrvz63d4rdc.png)
  • [技术干货] DB2 9(Viper)快速入门
    为了帮助您快速掌握 DB2 自身的 XML 特性,请完成几个普通的任务,比如:创建用于管理 XML 数据的数据库对象,包括一个测试数据库、一些示例表和视图。使用 INSERT 和 IMPORT 语句将 XML 数据填充到数据库中。验证您的 XML 数据。使用 DB2 开发和注册您的 XML 模式,并在导入数据时使用 XMLVALIDATE 选项。后续文章将包括其他主题,比如使用 SQL 查询、更新和删除 DB2 XML 数据,使用 XQuery 查询 DB2 XML 数据,开发存取 DB2 XML 数据的 Java 应用程序和 Web 组件。创建数据库对象让我们先来创建一个单独的 DB2 Unicode 数据库。在 DB2 Viper 中,只有 Unicode 数据库才能同时存储 XML 文档和 SQL 数据的更多传统格式,比如整数、日期/时间、变长字符串,等等。随后,您将在这个数据库中创建对象来管理 XML 和其他类型的数据。创建测试数据库为了创建一个新的 DB2 Unicode “测试” 数据库,打开 DB2 命令窗口,发出语句来指定 Unicode 编码集合和支持的区域,如 清单 1:清单 1. 创建用于存储 XML 数据的数据库create database test using codeset UTF-8 territory us一旦创建了 Unicode 数据库,您就不需要发出任何专门的命令或采取任何进一步措施来使 DB2 能够以它自身分层的格式存储 XML 数据,因为您的 DB2 系统已经准备好了。创建示例表为了存储 XML 数据,请创建包含一个或多个 XML 列的表。这些表充当文档集合的逻辑容器;在幕后,DB2 实际上使用了不同的存储方案来存储 XML 和非 XML 数据。然而,使用表作为管理各种受支持的数据格式的逻辑对象,简化了管理和应用程序开发问题,特别是当需要在一个单独的查询中集成不同的数据格式时。您可以对 DB2 表进行定义,使其只包含 XML 列、只包含传统 SQL 类型的列或者同时包含两者。本文对后一种情况进行了建模。清单 2 中的例子连接到 “测试” 数据库,并创建了两个表。第一个是 “items” 表,追踪关于货物的销售情况和顾客对货物的评价信息。第二个表追踪的是关于 “客户” 的信息,包括关于联系信息的数据。注意 “comments” 和 “contactinfo” 是基于新的 DB2 XML 数据类型,而所有其他的列都是基于传统 SQL 数据类型的。清单 2. 创建用于 XML 数据的表connect to test;create table items (id int primary key not null,brandname varchar(30),itemname varchar(30),sku int,srp decimal(7,2),comments xml);create table clients(id int primary key not null,name varchar(50),status varchar(10),contactinfo xml);如果您仔细地查看这些表定义例子,您将注意到 “comments” 和 “contactinfo” 列都没有进行 XML 文档内部结构的定义。这是 DB2 的一个重要特性。用户不需要为了存储数据而预定义一个 XML 数据结构(或者,更准确地说是一个 XML 模式)。事实上,DB2 可以在一个单独的列中存储任何格式良好的 XML 文档,这意味着不同模式的 XML 文档 —— 或没有和任何注册的模式关联的文档 —— 都可以存储在相同的 DB2 列中。当我们讨论如何在 DB2 中存储数据时,本文将深入讨论这个特性。创建视图您可以随意地在包含 XML 数据的表上创建视图,就像您可以在只包含传统 SQL 数据类型的表上创建视图一样。清单 3 中的例子创建具有 “Gold” 状态的客户的一个视图:清单 3. 创建一个包含 XML 数据的视图create view goldview asselect id, name, contactinfofrom clients where status='Gold';关于索引的一点说明最后,没有必要在 XML 列上创建专门的索引来提高数据的查询速度。因为这是一篇介绍性文章,而且示例数据很少,所以本文不会涵盖到那个主题。然而,在生产环境中,定义一个适当的索引对实现最佳的性能来说很关键。查看本文结尾部分的 “参考资料”,以助于了解 DB2 的新索引技术。存储 XML 数据创建好表之后,现在您就可以用数据填充它们了。您可以通过直接发出 SQL INSERT 语句来完成这项工作,或者通过调用 DB2 IMPORT 工具在后台发出 INSERT 语句。使用 INSERT 语句使用 INSERT,您可以直接向 DB2 中填充原始的 XML 数据。如果您已经编写了一个应用程序并在变量中存储了 XML 数据,那么这可能是最容易的方法。但是如果您只是刚开始使用 DB2 Viper,并且不想编写应用程序,那么您可以交互地发出 INSERT 语句(我发现使用 DB2 Command Editor 是很方便的,虽然您也可以使用命令行处理器,如果您更喜欢那么做的话)。。
  • [互动交流] centOS安装mysql提示报错Cannot download repomd.xml
    【功能模块】【操作步骤&问题现象】1、使用了华为云作为yum源2、运行命令 yum makecache 后提示报错Cannot download repomd.xml【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [SQL] GaussDB(DWS) XML数据处理实践
    【摘要】 GaussDB(DWS)支持XML数据类型及丰富的XML解析函数,可实现关系数据和XML数据的映射管理功能。XML概述XML是可扩展的标识语言(eXtensible Markup Language)的缩写,可以描述非常复杂的数据结构,广泛应用于传输和存储数据。XML是一种类似于HTML的标记语言,但XML没有使用预定义的标记,可以根据应用需求定义标记。XML的基本格式是标准化的,可以跨平台、操作系统和应用程序实现异构系统之间的数据共享。XML数据类型GaussDB(DWS)支持将XML文档存储在数据库的XML数据类型列中。通过XML数据类型来保存数据,相比于文本方式的优势在于具有数据结构检查功能,能够保证结构的正确,并且支持XML数据解析和处理函数。判断一个 XML 文档正确的标准是:文档必须是一个格式良好的文档。文档遵循 XML 所有的语法规则并且有效。文档遵循特定语义的规则,这些规则通常规定在 XML 或 DTD 规范中XML可以存储由XML标准定义的格式正确的文档,以及由XML标准中定义的内容片断,内容片断可以有多个顶级元素或字符节点。下面是一个格式良好的XML文档示例:<?xml version="1.0" encoding="UTF-8"?><message>Hello GaussDB(DWS)</message>可以使用INSERT SQL语句将格式良好的文档插入到XML列中,如果能够成功分析文档,那么就说明文档的格式正确。在执行插入或更新操作前,会根据配置参数来验证XML文档是否格式正确。在应用程序中的XML数据一般采用其序列化字符串格式,将数据插入到 XML 列中时,必须将它转换为 XML 分层格式。因此在执行插入操作时可显式调用 XMLPARSE 函数,以将数据从其序列化字符串格式转换为 XML 分层格式。test=# SELECT XMLPARSE(document '<root>GAUSSDB(DWS)</root>');          xmlparse           ---------------------------  <root>GAUSSDB(DWS)</root>(1 row)访问XML值当访问和处理XML数据时,由于XML数据在数据库内部的表示不是字符串,XML数据类型没有提供比较操作符,因此不能直接与字符串进行比较。这样的结果是无法通过比较XML数值和搜索值来检索到数据行,因此对于XML数据应该伴随一个ID值用于检索数据。通过使用 XMLSERIALIZE 函数,可以将 XML 值变换成表示 XML 文档的已序列化字符串值。test=# SELECT XMLSERIALIZE(document '<root>GAUSSDB(DWS)</root>' AS TEXT);        xmlserialize         ---------------------------  <root>GAUSSDB(DWS)</root>(1 row)XML解析函数目前GaussDB(DWS)已经支持了30多个XML解析函数,包括解析XML数据、生成XML内容、XML谓词、XML参数设置、将数据映射到XML等功能。处理XML数据的函数xpath 对xml值计算xpath表达式的结果xmltable 通过XPath表达式的方式对XML数据进行解析生成XML内容的函数xmlparse 字符数据转换为xml类型的值xmlserialize  xml类型转换为字符串xmlcomment 创建一个包含XML注释的特定文本内容的值xmlconcat 连接独立的XML值列表来创建一个包含XML内容片段的单值xmlelement 生成一个带有给定名称,属性和内容的XML元素。xmlforest 生成一个使用指定的名称和内容的XML森林(序列)元素xmlpi 创建一条XML处理指令xmlroot 更改XML值的根节点属性xmlagg 聚合函数,连接聚合函数调用的输入值XML谓词函数IS DOCUMENT 判断XML值是否为文档IS NOT DOCUMENT 判断XML值是否为文档xmlexists 判断XPath表达式是否返回任何节点xpath_exists 判断XPath表达式是否返回任何节点xml_is_well_formed 检查字符串是不是格式良好的XMLxml_is_well_formed_document  检查字符串是不是格式良好的XML文档xml_is_well_formed_content 检查字符串是不是格式良好的XML内容XML参数设置SET XML OPTION 设置XML格式SET XMLBINARY TO 设置二进制值在XML中的编码格式将表、查询、游标、数据库映射到XML的函数table_to_xml、query_to_xml、cursor_to_xml、database_to_xml等。具体每个函数的使用方法可以参考GaussDB(DWS)用户手册,下面主要介绍应用中常见的解析XML数据的XMLTABLE函数。XMLTABLE函数概述XMLTABLE函数通过XPath表达式的方式对XML数据进行解析,按照定义的列生成一个表将数据返回,返回的表可以包含任何 SQL 数据类型(包括 XML类型)。XMLTABLE函数支持将表中的XML数据或一个SELECT查询的XML数据作为变量传递到指定的XPath表达式上,通过XPath表达式解析XML数据后的结果用于产生表中的列值,生成的表的结构由 XMLTABLE 的 COLUMNS 子句定义,可以指定列名、数据类型和生成列值的方式来定义列的特征。下面演示一下XMLTABLE函数的使用方法,首先创建CUSTOMER表并插入包含客户信息的XML数据。CREATE TABLE CUSTOMER AS SELECT 1 AS ID,XML $$<ROWS>   <ROW ID="1">     <CUSTOMER_NAME>Tony</CUSTOMER_NAME> <PHONENUM>123-456-666</PHONENUM>   </ROW>   <ROW ID="2">     <CUSTOMER_NAME>Serena</CUSTOMER_NAME> <PHONENUM>123-456-888</PHONENUM>   </ROW>   <ROW ID="3">     <CUSTOMER_NAME>Tina</CUSTOMER_NAME> <PHONENUM>123-456-999</PHONENUM>   </ROW></ROWS>$$ AS INFO;通过以下 SELECT 语句在 XMLTABLE 函数中解析 CUSTOMER 表的 INFO 列。SELECT XMLTABLE.* FROM CUSTOMER,XMLTABLE('//ROWS/ROW'         PASSING INFO        COLUMNS ID INT PATH '@ID',         NAME VARCHAR(64) PATH 'CUSTOMER_NAME',         PHONENUM TEXT PATH 'PHONENUM');  id |  name  |  phonenum    ----+--------+-------------   1 | Tony   | 123-456-666   2 | Serena | 123-456-888   3 | Tina   | 123-456-999(3 rows)在GaussDB(DWS)上,XMLTABLE函数支持下推到数据节点DN执行的STREAM查询计划,XML数据在数据节点上进行解析生成XMLTABLE结果表,通过GATHER STREAM将结果汇总到协调节点CN上,能够下推到DN的STREAM计划具有较好的查询性能。XMLTABLE应用案例在业务场景中,经常会遇到需要解析XML文档的场景,使用XMLTABLE函数可以快捷方便的完成对XML数据的解析,将所需的数据以表的形式返回,便于对数据进一步的查询和分析。下面演示一个对消息数据的解析流程:1. 创建一张用于存储消息数据的表,插入数据。CREATE TABLE MSGS AS SELECT 1 AS ID, 'A,BB,CCC,DDDD,EEEEE' AS MSG;2. 将消息文本数据通过XMLPARSE函数转化为XML数据。test=# SELECT XMLPARSE(content '<r><c>' || REPLACE(MSG, ',', '</c><c>') ||'</c></r>') AS XML_MSG FROM MSGS;                           xml_msg                           -----------------------------------------------------------  <r><c>A</c><c>BB</c><c>CCC</c><c>DDDD</c><c>EEEEE</c></r>(1 row)3. 使用XMLTABLE函数对XML数据进行解析,逐条返回消息内容。test=# SELECT MSG_CONTENT FROMtest-# (SELECT XMLPARSE(content '<r><c>' || REPLACE(MSG, ',', '</c><c>') ||'</c></r>') AS XML_MSG FROM MSGS),test-# XMLTABLE('/r/c/text()' PASSING XML_MSG COLUMNS MSG_CONTENT VARCHAR(4000) PATH '.');  msg_content  -------------  A  BB  CCC  DDDD  EEEEE(5 rows)从上图中可以看到,XMLTABLE解析后的数据以表的形式返回,在这个XMLTABLE表上可以进一步的对数据排序、筛选等操作,同时GaussDB(DWS)也支持在函数或存储过程中进行XML数据的处理,使应用程序的开发非常便捷。总结GaussDB(DWS)支持了XML数据类型及丰富的XML解析函数,同时基于Shared Nothing的分布式架构具有良好的并行处理和扩展能力,对XML数据的解析任务可下推到数据节点上进行并行处理,完全能够满足应用中出现的XML数据解析需求。原文链接:https://bbs.huaweicloud.com/blogs/244334【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [技术干货] 数据库的种类
    DBMS(数据库管理系统)主要通过数据的保存格式进行分类,现阶段主要分为以下几种类型。层次数据库(Hierarchical Database,HDB)层次数据库是最早研制成功的数据库系统,它把数据通过层次结构(树形结构)的方式表现出来。层次数据库曾经是数据库的主流,但随着关系数据库的出现和普及,现在已经很少使用了。比较具有代表性的层次数据库是 IMS(Information Management System)数据库,由 IBM 公司研制成功。关系型数据库(Relational Database,RDB)关系型数据库是现在应用最广泛的数据库。关系型数据库在 1969 年诞生,可谓历史悠久。和 Excel 工作表一样,关系型数据库也采用由行和列组成的二维表来管理数据,所以简单易懂。同时,它还使用 SQL(Structured Query Language,结构化查询语言)对数据进行操作。传统的关系型数据库采用表格的存储方式,数据以行和列的方式进行存储,要读取和查询都十分方便。下表是一些在关系型数据库中的数据。商品编号商品名称商品种类销售单价进货单价登记日期0001T恤衫衣服100502020-12-240002打孔器办公用品5003202020-12-240003运动T恤衣服4002802020-12-240004菜刀厨房用具50302020-12-240005高压锅厨房用具2001002020-12-240006叉子厨房用具1052020-12-240007菜板厨房用具80702020-12-240008圆珠笔办公用品1052020-12-24 比较具有代表性的关系型数据库有 Oracle Database、SQL Server、DB2、PostgreSQL 和MySQL。面向文档(Document-Oriented)数据库文档型数据库的灵感来自于 Lotus Notes 办公软件,和最后一种键值存储数据库类似。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。面向文档数据库会将数据以文档的形式存储。每个文档都是一系列数据项的集合。每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串、数字和日期等;也可以是复杂的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML、JSON或者JSONB等多种形式存储。具有代表性的面向文档数据库有 MongDB 和 CouchDB。列存储(Column-oriented)数据库列存储数据库将数据存储存在列族(column family)中,一个列族用来存储经常被一起查询的相关数据。例如,如果有一个 Person 类,我们经常会一起查询他们的姓名和年龄而不是薪资。这种情况下,姓名和年龄就会被放入一个列族中,而薪资则在另一个列族中。列存储数据库通常用来应对分布式存储的海量数据。具有代表性的列存储数据库有 Cassandra 和 HBase。XML 数据库(XML Database,XMLDB)XML 数据库是一种支持对 XML(标准通用标记语言下的一个应用)格式文档进行存储和查询等操作的数据管理系统。在系统中,开发人员可以对数据库中的 XML 文档进行查询、导出和指定格式的序列化。键值存储数据库(Key-Value Store,KVS)键值存储数据库是用来保存查询所使用的主键(Key)和值(Value)的组合的数据库。具有编程语言知识的读者可以把它想象成关联数组或者散列(hash)。近年来,随着键值存储数据库被应用到 Google 等需要对大量数据进行超高速查询的 Web 服务当中,它正逐渐为人们所关注。具有代表性的键值存储数据库有 Redis、Memcached 和 MemcachedDB。
  • [技术干货] 《ONAP技术详解与应用实践》读书笔记9
    3.2 架构设计原则重要的几个原则:模型驱动、微服务化及云原生。3.2.1 模型驱动模型是对“事物”的一种抽象化表达,从特定角度对系统进行描述,省略部分不重要的细节,聚焦感兴趣的特性。模型驱动在软件开发领域有多种,如MBD(Model Based Development,基于模型的开发)、MDD(Model Driven Development,模型驱动开发)和MDA(Model Driven Architecture,模型驱动架构)。其主要核心都是从模型生成代码和其他开发过程中的组件,在解决领域问题的同时,提高生产效率。传统开发方式则是硬编码。两者差异在于:谁负责修改,改什么(包括在哪修改),影响多大。传统硬编码方式,所有变更都需要由原软件提供者(软件供应商)来修改,且需要在实际产品代码上修改,包括重新编译、发布、打包,再经过商业交付流程提供给使用者。使用者则只能等待版本,后再经过入网测试、升级部署等流程后才能使用。代价大、周期长(一般以月为单位),需要系统关机重启,影响较大。如果整个过程中发生任何问题,包括理解上的差异,很可能需要从头再来。而模型驱动,能做到对多数变更,但平台开发者(供应商)不需要参与代码修改,平台本身也不需停机、重新编译、发布。而是由使用者/用户通过修改外部(相对平台代码而言)的模型文件(TOSCA或YANG等)或插件(可能包括JavaScript、Python等动态语言)即可动态生效,这一开发过程在ONAP中被称为设计。模型的格式(模型文件应该如何描述)和模型生效的流程(模型如何加载、生效,如果中间出现错误如何处理等)需要事先约定。模型驱动表达的意思是,ONAP支持在不需要修改ONAP自身框架代码的前提下,通过对模型做组合/变更(新增,删除或修改),实现电信业新业务的上线或更新。一般是通过修改某些脚本及动态加载部分插件或驱动来实现的。模型驱动并不意味着业务变更完全不需要修改代码,只是不需要修改ONAP框架代码。ONAP作为面向电信领域的开源社区致力于以下几方面:全局数据结构:ONAP的全局数据结构都定义在Schema文件中,文件名类似aai_schema_v15.xsd。正常情况下,在SDC中每次修改模型的定义(不是模型对应的实例),则SDC会自动触发模型文件的版本递增,ONAP的A&AI支持多个版本的模型文件并存。ONAP在代码层面并不固定描述用户、网元或设备的数据模型,即没有硬编码定义这些对象的结构,而是采用Schema脚本进行描述。在需要变更时,只要在设计态修改对应Schema脚本,并分发到运行态涉及的组件中即可。各资源构件:各资源构件(网络或业务的定义,如BPMN与Policy等)都保存于可重用资源库目录中,方便动态支持资源上线、服务的定义和创建,且支持通过由更简单的、可重用的资源构件组合成复杂业务。ONAP平台自身:ONAP自身特异性也采取类似的元数据驱动的方式实现。比如从ONAP的Casablanca版本开始,在CCSDK项目中启动CDS(Controller Design Studio),通过设计与定义不同的控制器蓝图(Controller Blueprints),即可帮助运营商根据需要灵活定义Controller模板(比如将有线与无线融合到一个Controller,或者分成不同Controller)。1.常见模型包括业务模型、概念模型、数据模型、对象实例(物理数据模型)和元模型等信息模型、业务模型、概念模型:可简略记成IM(Information Model,信息模型),其为对现实世界中真实事物的描述,不涉及具体软件实现,例如员工、合同、客户、网络、站点、设备等;也包括这些抽象概念之间的关系,比如站点中“包含”设备、而交换机“属于”某种设备等。数据模型:可简略记成DM(Data Model),这是对业务模型/概念模型的进一步分解和细化,包括所有的实体(抽象代表一类对象,如员工代表所有具体的员工)和关系(实体间的关系)。需要确定每个实体的属性,定义每个实体的主键,指定实体的外键,并进行范式化处理。对象实例:英文一般为Instance(实例),用于在数据模型基础上定义每个具体的独立对象,元模型(Meta Data):即模型的模型,是模型驱动设计更高一层次的抽象。ONAP自身也采用了多种模型,比如面向业务与VNF生命周期管理的TOSCA语言,面向网络层配置管理的YANG语言,内部数据库建模又采用XML Schema语言等。2.常见模型语言1)XMLXML(Extensible Markup Language,可扩展的标记语言)是1998年2月由W3C(World Wide Web Consortium,万维网联盟)正式批准定义的标准通用标记语言。“标记”指计算机所能理解的信息符号,通过标记,计算机之间可以处理包含各种信息的文章等。XML是一套定义语义标记的规则,这些标记将文档分成很多部件并对这些部件加以标识。XML也是元标记语言,即为定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。XML是一种规则,其把一个文档划分为不同的层次或部分,并对这些层次或部分做好标记。XML文档的字符分为标记(Markup)与内容(content)两类。标记通常以“<”开头,以“>”结尾;或者以字符“&”开头,以“;”结尾;不是标记的字符就是内容。XML有如下几个特征:内容与形式分离,宗旨是传输和存储数据,而不是显示数据。良好的可扩展性,标签没有被预定义,需要自行定义。被设计为具有自我描述性。遵循严格的语法要求。便于不同系统之间信息的传输,是W3C的推荐标准。2)XML Schema语法正确—术语称为well-formed XML,但不一定合法—术语称为validating XML。比如年龄这个标签,在计算机处理中还需更进一步严格定义:数据类型是一个数值,而不是字符串。显然,说年龄是10(岁),这是合法的(一个数值);而把年龄说成一个字符串OK或“非常大”,则是非法的。为了约束一个字段或者说为了约束XML的类型,就有了XML Schema(XML Schema Definition,XSD),它是一套W3C标准,即为用于XML的模式定义语言,其作为关联的文档来定义XML标记规范。对Age进行约束的例子。Age这个标签(XML又称元素,即element)有如下定义/约束:value必须是整型(xs:integer)。值范围必须是7~50。3)YAMLYAML(Yet Another Markup Language,另一种标记语言)是一种以数据为中心的标记语言,官方定义为一种人性化的数据格式定义语言。数据组织主要依靠的是空白、缩进、分行等结构。YAML相比XML有如下优点:可读性好和脚本语言交互性好使用实现语言的数据类型有个一致的信息模型易于实现由于YAML有较好的可扩展性与可读性,相比XML编码效率更高,在特定场景下具备明显优势。比如常用的动态语言就支持用YAML定义的数据结构与数据类型。4)YANGYANG是IETF在RFC 6020中定义的用于网络配置的数据模型描述语言,支持NETCONF接口协议,实现了网络配置的标准化,是一种DSL(领域特有语言)。NETCONF协议是一个网络配置管理协议,是由IETF标准组织定义的一套管理网络设备的机制。用户可使用这套机制增加、修改、删除网络设备的配置,获取网络设备的配置和状态信息。YANG与XSD(XML Schema Definition)基本是等价的,也即YANG是一种Schema定义的语言,而不是像XML/YAML一样为了数据的传输和存储。相比XML Schema,YANG语言定义的数据模型没有晦涩的内容,可读性好、简单易懂、可扩展。当前YANG已在设备配置领域被普遍接受,IETF、ONF等标准组织都要求提交的模型用YANG来写。其他组织,如Openconfig,OpenDayLight等也普遍支持YANG。5)TOSCATOSCA全称是Topology and Orchestration Specification for Cloud Applications,是一种数据建模描述语言,是由OASIS组织制定的面向云计算环境中的应用拓扑和编排描述语言,目前支持YAML和XML实现。TOSCA的基本概念:节点(node)和关系(relationship),且都可通过程序来扩展,同时TOSCA规范中也支持Plan(即Workflow工作流文件)。(1)节点预定义了很多基础类型,包括云基础设施中常用的计算节点、网络节点、数据库节点等。(2)关系定义了node之间的关系,具体如下:DependsOn(依赖于):表示节点间的顺序依赖关系HostedOn(运行于):比如即数据库运行在计算机上ConnectsTo(连接):表示连接关系。TOSCA面向云计算环境中的应用拓扑和编排场景来预定义一些属性,较适合用于解决以下场景中的需求:(1)自动化的软件部署和管理。(2)应用生命周期(安装、扩容、卸载等)管理方案的可移植性(不是应用本身的可移植性)。(3)组件之间的互操作性和重用性。YANG、TOSCA都具备较强的扩展能力如,NFV领域的VNFD,就是以TOSCA描述文件(可以是YAML或XML格式)进行说明的,包括安装软件过程中都有哪些组件、组件之间有什么依赖关系等;当然,实际运行时还需要用TOSCA运行态环境来对TOSCA文件进行读取(分析文件的语法、语意)和解释执行(进行具体的软件安装、配置工作)。3.2.2 微服务化服务化架构(Service-Oriented Architecture,SOA)是一种粗粒度、松耦合的以服务为中心的架构,服务之间通过定义明确的协议和接口进行通信。这里说的“服务”,就是指RPC远程程序调用。面向服务架构(Service-Oriented Architecture,SOA)是Gartner于20世纪90年代中期提出的概念,主要面向分布式系统的开发。多数是遵从著名SOA专家Thomas Erl的归纳:标准化的服务契约(Standardized service contract)服务的松耦合(Service loose coupling)服务的抽象(Service abstraction)服务的可重用性(Service reusability)服务的自治性(Service autonomy)服务的无状态性(Service statelessness)服务的可发现性(Service discoverability)服务的可组合性(Service composability)这些原则目的是:提高软件重用性,减少开发维护成本,最终增加业务的敏捷度。微服务架构则是一种服务化架构,提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立部署到生产环境、类生产环境等。微服务的诞生并非偶然。它是互联网高速发展,敏捷、精益、持续交付方法论的深入人心,虚拟化技术与DevOps文化的快速发展,以及传统单块架构无法适应快速变化等多重因素的推动下所诞生的产物,涉及业务、开发、测试、部署、运维等多个环节。SOA与微服务架构在很多地方是重合的(可以混用)。如果要区分的话,SOA关注的是服务的重用;微服务则在关注服务重用的同时,也同时关注快速交付。ONAP架构支持微服务化,各项目都分成多个独立服务,可单独部署。服务之间的通信经由DMaap或MSB项目(都是基于Kafka构建的服务),支持弹性缩放和CI/CD环境的集成。3.2.3 云原生设计2010年,WSO2的联合创始人Paul Fremantle在业界最早提出Cloud Native,认为其有如下几个关键特征:Distributed/Dynamically wired,分布式/动态连接Elastic,弹性Scale down as well as up, based on load,基于系统负载的动态伸缩Granularly metered and billed,粒度合适的计量计费Pay per user,按使用量计费Multi-tenant,支持多租户Self service,支持自服务Incrementally deployed and tested,支持增量的部署与测试云原生系统的效果应该是更好地利用资源,更快地提供资源,更好地管理在2013年,AWS的云战略架构师,同时也是NetFlix的云架构师Adrian Cockcroft 对Cloud Native新的定义:基于不可靠的、易失效的基础设施构建高度敏捷、高可用的服务。2015年,Google联合其他20家公司宣布成立了开源组织Cloud Native Computing Foundation(CNCF),开源了Kubernetes。Kubernetes是一个以应用为中心的容器编排、调度集群管理系统,希望成为CloudNative Application的基石。从CNCF组织来看,Cloud-Native Application应该包含微服务、容器、CI/CD特征。Cloud Native的软件架构需求有:按需特性的伸缩按特性持续演进应用快速上线系统高可用全面解耦合系统自服务支持多租户异构公有云ONAP当前支持在OpenStack及微软Azure上运行,未来还计划支持AWS。
  • [热门活动] 【HDZ Summit 2020】码豆发放失败用户名单,附领取攻略
    以下开发者发放码豆失败。为保证您顺利领取码豆,请您至少登录一次DevCloud会员中心https://devcloud.huaweicloud.com/bonususer/home。如您修改过用户名还请一并提供修改前的以及最新的用户名。详情请咨询版主或小助手(Huawei-HDZ),备注“补发码豆”,反馈时间截至2020年8月1日,如您在此之前没有反馈,视为自动放弃获奖资格。抓紧时间呦~
  • [HPC] Hadoop 3.1.2+Spark 2.4.4 移植指南(CentOS 7.6)
    文档位置已迁移至如下链接:https://support.huaweicloud.com/prtg-kunpenghpcs/kunpenghpcs_prtg_0013.html
总条数:68 到第
上滑加载中