Main Content

readstruct

从文件创建结构体

自 R2020b 起

    说明

    示例

    S = readstruct(filename) 通过从文件中读取结构化数据来创建一个结构体。输入文件必须包含格式正确的 XML 结构。

    readstruct 自动检测输入文件中内容的数据类型。

    示例

    S = readstruct(filename,Name,Value) 基于文件创建一个结构体,并通过一个或多个名称-值对组参数指定其他选项。例如,当 filename 中的文件扩展名不是 .xml 时,您可以通过调用 S = readstruct(filename,'FileType','xml') 以 XML 形式读取输入文件的内容。

    示例

    全部折叠

    以结构体形式读取 XML 文件,从该结构体创建变量,并查询其内容。

    文件 music.xml 具有以下结构。

    music.png

    music.xml 作为结构体 S 读入 MATLAB 中。此结构体包含一个父节点 MusicalEnsemble,该节点有两个同级节点 EnsembleMusicians

    S = readstruct("music.xml")
    S = struct with fields:
         Ensemble: [1x1 struct]
        Musicians: [1x1 struct]
    
    

    从第一个同级节点创建一个变量 bandband 有三个字段,其中一个是名为 Instrumentation 的结构体。

    band = S.Ensemble
    band = struct with fields:
                  Music: "Jazz"
               BandName: "Kool Katz"
        Instrumentation: [1x1 struct]
    
    

    band 中查询 Instrumentation 以查看其内容。

    band.Instrumentation
    ans = struct with fields:
        Instrument: [1x4 struct]
    
    

    从第二个同级节点创建一个变量 musiciansmusicians 有一个名为 Name 的字段,其中包含五个结构体。

    musicians = S.Musicians
    musicians = struct with fields:
        Name: [1x5 struct]
    
    

    从不包含统一结构化数据的 XML 文件创建一个结构体,然后显示其内容。

    如果一个同级节点包含其他同级节点没有的字段,则对于在其他节点中找不到的字段,readstruct 将返回 missing。例如,在文件 music.xml 中,第二个 Instrument 节点包含非空字段 pianotype。由于其他 Instrument 节点没有为 pianotype 指定的值,因此对于在这些 Instrument 节点下的 pianotypereadstruct 返回 missing

    music.png

    将 XML 文件 music.xml 读取到结构体 S

    S = readstruct("music.xml")
    S = struct with fields:
         Ensemble: [1x1 struct]
        Musicians: [1x1 struct]
    
    

    在 S 中查询 Instrument 结构体以查看其内容。

    S.Ensemble.Instrumentation.Instrument
    ans=1×4 struct array with fields:
        typeAttribute
        Text
        pianotype
        drumkit
        basstype
    
    

    以结构体形式读取一个文本文件。

    文件 music.txt 具有以下结构。

    music.png

    将文本文件 music.txt 作为结构体 S 读入 MATLAB® 中。将 'FileType' 指定为 'xml',以将输入的内容作为 XML 文件读取。

    S = readstruct("music.txt","FileType","xml")
    S = struct with fields:
         Ensemble: [1x1 struct]
        Musicians: [1x1 struct]
    
    

    通过使用 'StructNodeName' 名称-值对组,从输入文件中的特定元素节点创建一个结构体。

    从 XML 文件 music.xml 中读取 Instrumentation 节点。

    S = readstruct("music.xml","StructNodeName","Instrumentation")
    S = struct with fields:
        Instrument: [1x4 struct]
    
    

    指定在其下开始读取输入文件中的结构体的准确 XML 元素节点。

    读取 XML 文件 music.xml 中的第五个 Name 元素。将该元素节点的完整 XPath 表达式指定为 'StructSelector' 的值。

    S = readstruct("music.xml","StructSelector","/MusicalEnsemble/Musicians/Name[5]")
    S = struct with fields:
        roleAttribute: "bassist"
                 Text: "John"
    
    

    使用 RegisteredNamespaces 名称-值参数将自定义 XML 命名空间前缀注册到输入文件中的现有命名空间 URL。

    要以结构体形式读取第二个 Street 元素节点,请将 'StructSelector' 的值指定为 '//Student[2]/Address/myPrefix:Street',将 RegisteredNamespaces 的值指定为 ["myPrefix","https://www.mathworks.com"]

    S = readstruct("students.xml","RegisteredNamespaces",["myPrefix","https://www.mathworks.com"],...
        "StructSelector",'//Student[2]/Address/myPrefix:Street')
    S = struct with fields:
        xmlnsAttribute: "https://www.mathworks.com"
                  Text: "4641 Pearl Street"
    
    

    输入参数

    全部折叠

    要读取的文件的名称,指定为字符向量或字符串标量。

    根据文件的位置,filename 可以采用下列形式之一。

    位置

    形式

    当前文件夹或 MATLAB® 路径上的文件夹

    指定 filename 中文件的名称。

    示例:'myFile.xml'

    文件夹中的文件

    如果该文件不在当前文件夹或 MATLAB 路径下的文件夹中,则在 filename 中指定完整或相对路径名。

    示例:'C:\myFolder\myFile.xml'

    示例:'dataDir\myFile.xml'

    Internet URL

    如果文件指定为 Internet 统一资源定位器 (URL),则 filename 必须包含协议类型 'http://''https://'

    示例:'http://hostname/path_to_file/my_data.xml'

    远程位置

    如果文件存储在远程位置,则 filename 必须包含用以下格式指定的文件的完整路径:

    scheme_name://path_to_file/my_file.ext

    根据远程位置,scheme_name 可以是下表中的值之一。

    远程位置scheme_name
    Amazon S3™s3
    Windows Azure® Blob Storagewasb, wasbs
    HDFS™hdfs

    有关详细信息,请参阅处理远程数据

    示例:'s3://bucketname/path_to_file/my_setup.xml'

    名称-值参数

    将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

    在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

    示例: 'ImportAttributes',true 指定将与元素节点相关联的属性作为输出结构体的字段导入。

    文件类型,指定为以逗号分隔的对组,该对组由 'FileType' 和下列值之一组成:

    • 'auto' - 根据在 filename 中指定的扩展名自动检测输入文件的文件格式。

    • 'xml' - 以 XML 形式读取输入文件的内容。

    如果 filename 中的文件扩展名不是 .xml,您可以将 'FileType' 的值指定为 'xml',以便以 XML 形式读取输入文件的内容。

    示例: 'FileType','xml'

    用于读取日期的区域设置,指定为逗号分隔的对组,其中包含 'DateLocale' 和一个 xx_YY 形式的字符向量或字符串标量,其中:

    • YY 是指示国家/地区的大写 ISO 3166-1 alpha-2 代码。

    • xx 是指示语言的小写 ISO 639-1 双字母代码。

    下表列出了区域设置的某些常用值。

    区域设置 语言国家/地区
    'de_DE'德语德国
    'en_GB'英语英国
    'en_US'英语美国
    'es_ES'西班牙语西班牙
    'fr_FR'法语法国
    'it_IT'意大利语意大利
    'ja_JP'日语日本
    'ko_KR'韩语韩国
    'nl_NL'荷兰荷兰
    'zh_CN'简体中文中国

    示例: 'DateLocale','ja_JP'

    起始 XML 元素,指定为由 'StructNodeName' 和字符向量或字符串标量组成的以逗号分隔的对组。readstruct 从指定的 XML 元素开始读取输入文件中的结构体。如果未指定 StructNodeName,则 readstruct 会从 XML 文件的根开始读取结构体。

    readstruct 匹配其名称与 StructNodeName 中指定的值匹配的 XML 文档中的第一个节点。

    示例: 'StructNodeName','RootName'

    起始 XML 路径,指定为由 'StructSelector' 和字符向量或字符串标量组成的以逗号分隔的对组。readstruct 从指定的路径上的元素开始读取输入文件中的结构体。'StructSelctor' 的值必须为有效的 XPath 版本 1.0 表达式。

    导入属性,指定为逗号分隔的对组,包含 'ImportAttributes'1 (true) 或 0 (false)。如果将值指定为 false,则 readstruct 不会将输入文件中的 XML 属性作为输出结构体中的字段导入。

    示例: 'ImportAttributes',false

    属性后缀,指定为由 'AttributeSuffix' 和字符向量或字符串标量组成的以逗号分隔的对组。readstruct 将此后缀附加到输出结构体中所有与输入 XML 文件中的属性对应的字段名称。如果未指定 'AttributeSuffix',则 readstruct 默认将后缀 'Attribute' 附加到与输入 XML 文件中的属性对应的所有字段名称。

    示例: 'AttributeSuffix','_att'

    注册的 XML 命名空间前缀集,指定为 RegisteredNamespaces 和由前缀组成的数组。读取函数在计算 XML 文件的 XPath 表达式时使用这些前缀。将命名空间前缀及其关联的 URL 指定为 N×2 字符串数组。RegisteredNamespaces 还可以用于计算由选择器名称-值参数(例如 readstructStructSelectorreadtablereadtimetableVariableSelectors)指定的 XPath 表达式。

    默认情况下,读取函数会自动检测要注册以用于 XPath 计算的命名空间前缀,但您也可以使用 RegisteredNamespaces 名称-值参数注册新命名空间前缀。当 XML 节点有命名空间 URL 但在 XML 文件中没有声明的命名空间前缀时,您可以注册新命名空间前缀。

    例如,对名为 example.xml 的不包含命名空间前缀的 XML 文件计算 XPath 表达式。将 'RegisteredNamespaces' 指定为 ["myprefix", "https://www.mathworks.com"] 以将前缀 myprefix 赋给 URL https://www.mathworks.com

    S = readstruct("example.xml",StructSelector="/myprefix:Data",...
    RegisteredNamespaces=["myprefix", "https://www.mathworks.com"])

    示例: 'RegisteredNamespaces',["myprefix", "https://www.mathworks.com"]

    HTTPHTTPS 请求选项,指定为 weboptions 对象。当指定的 filename 是包含协议类型 "http://""https://" 的 Internet URL 时,由 weboptions 对象确定如何导入数据。

    输出参数

    全部折叠

    输出结构体。结构体是使用被称为字段的数据容器将相关数据组合在一起的一种数据类型。每个字段都可以包含任意类型的数据。使用 structName.fieldName 格式的圆点表示法来访问结构体中的数据。有关结构体的详细信息,请参阅 struct

    提示

    • 使用 XPath 选择器指定要导入 XML 输入文档的哪些元素。下表提供 XPath 选择器名称-值参数 StructSelector 支持的 XPath 语法。

      选取操作语法示例结果
      选择其名称与您要选择的节点匹配的节点,而无论它在文档中的位置如何。在名称前加两个正斜杠 (//) 前缀。
      data = readstruct("music.xml",StructSelector="//Ensemble")
      data = 
      
        struct with fields:
      
                    Music: "Jazz"
                 BandName: "Kool Katz"
          Instrumentation: [1×1 struct]
      在一组节点中选择一个特定节点。在方括号 ([]) 中提供要选择的节点的索引。
      data = readstruct("music.xml",...
              StructSelector=...
              "//Ensemble/Instrumentation/Instrument[3]")
      data = 
      
        struct with fields:
      
          typeAttribute: "percussion"
                   Text: "Drums"
                drumkit: ["Bass drum"    "Floor tom"    "Snare drum"...
                          "Hi-hat"    "Ride cymbal"]
      指定运算的优先级。在要首先计算的表达式前后添加圆括号。
      data = readstruct("students.xml",...
              StructSelector="//Student/Name[4]")
      Error using readstruct
      No node with the selector '//Student/Name[4]' could be...
       found in the file 'students.xml'. 'StructSelector' must...
       refer to a valid node.
      data = readstruct("students.xml",...
              StructSelector="(//Student/Name)[4]")
      data = 
      
        struct with fields:
      
          FirstNameAttribute: "Salim"
           LastNameAttribute: "Copeland"

    版本历史记录

    在 R2020b 中推出

    另请参阅