C#,读取类似 XML 的模式并将其写入类似的数据格式

wee*_*hee 1 c# xml format schema dataset

我有这个数据集,其结构与 XML 数据类似,只是它不使用 <> 或 </> 来分隔数据,而是使用 ()、制表符和换行符。但数据的工作方式相同,有模式定义和子/父节点。

C# 中是否有一种方法可以使用类似于 XPathSelectElements() 的方法来读取/写入此数据?

这是我需要解析的数据示例:

WARNING: Do Not Modify This File!
Check 24.1.6 Data File
CONTROL 1 (
  code = CEZ_90_1_2016
  compliance mode = UA
  version = 24.1.6 )
LOCATION 1 (
  state = Texas
  city =  USA )
BUILDING 1 (
  project type = NEW_CONSTRUCTION
  bldg use type = WHOLE_BLDG
  feet bldg height = 0.000
  number of stories = 1
  is nonresidential conditioning = TRUE
  is residential conditioning = FALSE
  is semiheated conditioning = FALSE
  conditioning = HEATING_AND_COOLING)
ENVELOPE 1 (
  use orient details = TRUE
  use vlt details = TRUE
  use cool roof performance details = FALSE )
AG WALL 1 (
  wall type = MASONRY_AG_WALL
  next to uncond space = FALSE
  concrete thickness = 12.00
  concrete density = 115.00
  furring type = NO_FURRING
  cmu type = CMU_PARTIAL_GROUT_CELLS_EMPTY
  list position = 1
  description = <|Concrete Block:12", Partially Grouted, Cells Empty|>
  assembly type = <|Exterior Wall 1|>
  parent number = 0
  bldg use key = 1884629903
  continuous rvalue = 10.00
  daylight credit = 0.000
  orientation = WEST
  allowance type = ENV_ALLOWANCE_NONE
  exemption type = ENV_EXEMPTION_NONE
  valid allowance type = FALSE
  valid exemption type = FALSE
  construction type = NON_RESIDENTIAL 
  adjacent space type = ADJACENT_SPACE_EXTERIOR 
  gross area = 3377.000)
DOOR 4 (
  door type = INSUL_METAL_DOOR
  door open type = SWINGING_DOOR
  list position = 3
  description = <|Insulated Metal|>
  assembly type = <|Door 1|>
  parent number = 1
  bldg use key = 1884629903
  prop uvalue = 0.100000
  daylight credit = 0.000
  orientation = WEST
  allowance type = ENV_ALLOWANCE_NONE
  exemption type = ENV_EXEMPTION_NONE
  valid allowance type = FALSE
  valid exemption type = FALSE
  construction type = NON_RESIDENTIAL 
  adjacent space type = ADJACENT_SPACE_EXTERIOR 
  gross area = 21.000)
AG WALL 2 (
  wall type = METAL_FRAME_16_AG_WALL
  next to uncond space = FALSE
  list position = 4
  description = <|Steel-Framed, 16" o.c.|>
  assembly type = <|Exterior Wall 2|>
  parent number = 0
  bldg use key = 1884629903
  cavity rvalue = 21.00
  continuous rvalue = 0.00
  daylight credit = 0.000
  orientation = NORTH
  allowance type = ENV_ALLOWANCE_NONE
  exemption type = ENV_EXEMPTION_NONE
  valid allowance type = FALSE
  valid exemption type = FALSE
  construction type = NON_RESIDENTIAL 
  adjacent space type = ADJACENT_SPACE_EXTERIOR 
  gross area = 42.000)
Run Code Online (Sandbox Code Playgroud)

这是架构布局。正如你所看到的,它甚至说 rootXmlClass,所以这是一种 xml 格式,我只是非常困惑它如何与此选项卡、换行符和括号格式而不是典型的 XML 文件一起使用。我还从该软件的创建者那里获得了 .xsd 架构定义,但它没有为我提供任何帮助......

# Documentation available at https://cvs.pnl.gov/BecpApps/wiki/schemaGenerator
namespace http://energycode.pnl.gov/ns/ComCheckBuildingSchema
rootXmlClass BUILDING

#############################
# Building and Project Data #
#############################

class BUILDING
child CONTROL 1
child EFFICIENCY_PACKAGE efficiencyPackages
child LOCATION 1
child PROJECT 1
child ENVELOPE 1
child LIGHTING 1
child HVAC 1
child SWH_SYSTEM serviceWaterHeating
child REQUIREMENT_ANSWER requirements


class CONTROL

class PROJECT

class LOCATION

class WHOLE_BLDG_USE
child INTERIOR_SPACE 1 activity_category_number

class ACTIVITY_USE
child INTERIOR_SPACE 1 activity_category_number

class EXTERIOR_USE
child EXTERIOR_SPACE 1 linked_use_area_index


#################
# Lighting Data #
#################

container LIGHTING
child WHOLE_BLDG_USE
child ACTIVITY_USE
child EXTERIOR_USE

class INTERIOR_SPACE interiorLightingSpace
child FIXTURE * parent_number

# Removed "child FIXTURE * parent_number" from the EXTERIOR_SPACE class, which will break the schema generator
class EXTERIOR_SPACE exteriorLightingSpace
child EXTERIOR_FIXTURE fixtures parent_number

class FIXTURE
class EXTERIOR_FIXTURE fixture


#################
# Envelope Date #
#################

container ENVELOPE
child AG_WALL aboveGroundWalls
child BG_WALL belowGroundWalls
child ROOF
child FLOOR
child DOOR
child WINDOW
child SKYLIGHT

class AG_WALL
child WINDOW * parent_number
child DOOR * parent_number

class BG_WALL
child WINDOW * parent_number
child DOOR * parent_number

class FLOOR

class ROOF
child SKYLIGHT * parent_number

class SKYLIGHT

class WINDOW

class DOOR


###################
# Mechanical Data #
###################

container HVAC
child HVAC_SYSTEM
child HVAC_PLANT
child FAN_SYSTEM

class HVAC_SYSTEM
child REQUIREMENT_ANSWER requirements parent_number

class HVAC_PLANT
child REQUIREMENT_ANSWER requirements parent_number

class SWH_SYSTEM
child REQUIREMENT_ANSWER requirements parent_number

class FAN_SYSTEM
child FAN * parent_number
child PRESSURE_DROP_CREDIT * parent_number

class FAN

class PRESSURE_DROP_CREDIT

################
# Requirements #
################

class REQUIREMENT_ANSWER

################
# efficiency Packages #
################
class EFFICIENCY_PACKAGE
Run Code Online (Sandbox Code Playgroud)

谢谢

Nor*_*orm 7

当然。这是解析文件的快速语法。我实际上不知道规则,也不知道所需的结构是什么,所以这只是一个快速的逆向工程工作。

Document = Warning, check, data+, #a? .
-Warning = -"WARNING: Do Not Modify This File!", -#a.
-check = -"Check 24.1.6 Data File", -#a .
data = name, -' ', number, -' (', -#a, property++-#a, -' '?, -')', -#a .

name = namechar, (namechar | ' ')*, namechar .
-namechar = ['A'-'Z'] | ['a'-'z'] .
number = ['0'-'9']+ .
property = -' '*, name, -' = ', value .
value = ~[#a]+ .
Run Code Online (Sandbox Code Playgroud)

从上面的示例中,它生成:

<Document xmlns:ixml="http://invisiblexml.org/NS" ixml:state="ambiguous">
   <data>
      <name>CONTROL</name>
      <number>1</number>
      <property>
         <name>code</name>
         <value>CEZ_90_1_2016</value>
      </property>
      <property>
         <name>compliance mode</name>
         <value>UA</value>
      </property>
      <property>
         <name>version</name>
         <value>24.1.6</value>
      </property>
   </data>
   <data>
      <name>LOCATION</name>
      <number>1</number>
      <property>
         <name>state</name>
         <value>Texas</value>
      </property>
      <property>
         <name>city</name>
         <value> USA</value>
      </property>
   </data>
   <data>
      <name>BUILDING</name>
      <number>1</number>
      <property>
         <name>project type</name>
         <value>NEW_CONSTRUCTION</value>
      </property>
      <property>
         <name>bldg use type</name>
         <value>WHOLE_BLDG</value>
      </property>
      <property>
         <name>feet bldg height</name>
         <value>0.000</value>
      </property>
      <property>
         <name>number of stories</name>
         <value>1</value>
      </property>
      <property>
         <name>is nonresidential conditioning</name>
         <value>TRUE</value>
      </property>
      <property>
         <name>is residential conditioning</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>is semiheated conditioning</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>conditioning</name>
         <value>HEATING_AND_COOLING</value>
      </property>
   </data>
   <data>
      <name>ENVELOPE</name>
      <number>1</number>
      <property>
         <name>use orient details</name>
         <value>TRUE</value>
      </property>
      <property>
         <name>use vlt details</name>
         <value>TRUE</value>
      </property>
      <property>
         <name>use cool roof performance details</name>
         <value>FALSE</value>
      </property>
   </data>
   <data>
      <name>AG WALL</name>
      <number>1</number>
      <property>
         <name>wall type</name>
         <value>MASONRY_AG_WALL</value>
      </property>
      <property>
         <name>next to uncond space</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>concrete thickness</name>
         <value>12.00</value>
      </property>
      <property>
         <name>concrete density</name>
         <value>115.00</value>
      </property>
      <property>
         <name>furring type</name>
         <value>NO_FURRING</value>
      </property>
      <property>
         <name>cmu type</name>
         <value>CMU_PARTIAL_GROUT_CELLS_EMPTY</value>
      </property>
      <property>
         <name>list position</name>
         <value>1</value>
      </property>
      <property>
         <name>description</name>
         <value>&lt;|Concrete Block:12", Partially Grouted, Cells Empty|></value>
      </property>
      <property>
         <name>assembly type</name>
         <value>&lt;|Exterior Wall 1|></value>
      </property>
      <property>
         <name>parent number</name>
         <value>0</value>
      </property>
      <property>
         <name>bldg use key</name>
         <value>1884629903</value>
      </property>
      <property>
         <name>continuous rvalue</name>
         <value>10.00</value>
      </property>
      <property>
         <name>daylight credit</name>
         <value>0.000</value>
      </property>
      <property>
         <name>orientation</name>
         <value>WEST</value>
      </property>
      <property>
         <name>allowance type</name>
         <value>ENV_ALLOWANCE_NONE</value>
      </property>
      <property>
         <name>exemption type</name>
         <value>ENV_EXEMPTION_NONE</value>
      </property>
      <property>
         <name>valid allowance type</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>valid exemption type</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>construction type</name>
         <value>NON_RESIDENTIAL </value>
      </property>
      <property>
         <name>adjacent space type</name>
         <value>ADJACENT_SPACE_EXTERIOR </value>
      </property>
      <property>
         <name>gross area</name>
         <value>3377.000</value>
      </property>
   </data>
   <data>
      <name>DOOR</name>
      <number>4</number>
      <property>
         <name>door type</name>
         <value>INSUL_METAL_DOOR</value>
      </property>
      <property>
         <name>door open type</name>
         <value>SWINGING_DOOR</value>
      </property>
      <property>
         <name>list position</name>
         <value>3</value>
      </property>
      <property>
         <name>description</name>
         <value>&lt;|Insulated Metal|></value>
      </property>
      <property>
         <name>assembly type</name>
         <value>&lt;|Door 1|></value>
      </property>
      <property>
         <name>parent number</name>
         <value>1</value>
      </property>
      <property>
         <name>bldg use key</name>
         <value>1884629903</value>
      </property>
      <property>
         <name>prop uvalue</name>
         <value>0.100000</value>
      </property>
      <property>
         <name>daylight credit</name>
         <value>0.000</value>
      </property>
      <property>
         <name>orientation</name>
         <value>WEST</value>
      </property>
      <property>
         <name>allowance type</name>
         <value>ENV_ALLOWANCE_NONE</value>
      </property>
      <property>
         <name>exemption type</name>
         <value>ENV_EXEMPTION_NONE</value>
      </property>
      <property>
         <name>valid allowance type</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>valid exemption type</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>construction type</name>
         <value>NON_RESIDENTIAL </value>
      </property>
      <property>
         <name>adjacent space type</name>
         <value>ADJACENT_SPACE_EXTERIOR </value>
      </property>
      <property>
         <name>gross area</name>
         <value>21.000</value>
      </property>
   </data>
   <data>
      <name>AG WALL</name>
      <number>2</number>
      <property>
         <name>wall type</name>
         <value>METAL_FRAME_16_AG_WALL</value>
      </property>
      <property>
         <name>next to uncond space</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>list position</name>
         <value>4</value>
      </property>
      <property>
         <name>description</name>
         <value>&lt;|Steel-Framed, 16" o.c.|></value>
      </property>
      <property>
         <name>assembly type</name>
         <value>&lt;|Exterior Wall 2|></value>
      </property>
      <property>
         <name>parent number</name>
         <value>0</value>
      </property>
      <property>
         <name>bldg use key</name>
         <value>1884629903</value>
      </property>
      <property>
         <name>cavity rvalue</name>
         <value>21.00</value>
      </property>
      <property>
         <name>continuous rvalue</name>
         <value>0.00</value>
      </property>
      <property>
         <name>daylight credit</name>
         <value>0.000</value>
      </property>
      <property>
         <name>orientation</name>
         <value>NORTH</value>
      </property>
      <property>
         <name>allowance type</name>
         <value>ENV_ALLOWANCE_NONE</value>
      </property>
      <property>
         <name>exemption type</name>
         <value>ENV_EXEMPTION_NONE</value>
      </property>
      <property>
         <name>valid allowance type</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>valid exemption type</name>
         <value>FALSE</value>
      </property>
      <property>
         <name>construction type</name>
         <value>NON_RESIDENTIAL </value>
      </property>
      <property>
         <name>adjacent space type</name>
         <value>ADJACENT_SPACE_EXTERIOR </value>
      </property>
      <property>
         <name>gross area</name>
         <value>42.000</value>
      </property>
   </data>
</Document>
Run Code Online (Sandbox Code Playgroud)

这是不明确的,因为有时我所调用的内容data以 结尾 ),有时以 结尾)。也许可以消除这种歧义,但我认为这是无害的。

如果实际数据中有更多的实际变化(例如空格),您可能需要更加努力地工作。

注意:为了避免名称后跟数字的格式出现歧义,此语法要求名称至少有两个字符长。


Mic*_*Kay 5

InvisibleXML 的一个很好的用例: https: //invisiblexml.org。如果您可以为您的数据格式编写 BNF 语法(使用 BNF 的 InvisibleXML 方言),那么您将能够使用 XSLT、XPath 和 XSD 等 XML 工具来处理数据。