Visio Master Shape 属性存储在哪里?
Where are Visio Master Shape properties stored?
我有一个程序可以解析 Visio 文件的 XML 数据。在此文件中,有一个由多个主控形状组成的分组形状。像这样:
每个形状都有一个 属性 叫做 Pin
Pin 1 是主形状中保存的默认值。当我解压缩 Visio 文件并查看 XML 数据时,"Pin" 属性 不会出现在引脚 1 上,但它会出现在所有其他引脚上。
<PageContents xmlns="http://schemas.microsoft.com/office/visio/2012/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xml:space="preserve">
<Shapes>
<Shape ID="2010" Type="Group" LineStyle="7" FillStyle="7" TextStyle="7" UniqueID="{B849B0B2-94FC-4CC7-843F-6A55BDBD37E6}">
<Cell N="PinX" V="8.484814432615094"/>
<...etc>
<Section N="Property">
<Row N="REF">
<Cell N="Value" V="X999" U="STR"/>
<...etc>
</Row>
</Section>
<Shapes>
<Shape ID="2" NameU="Pin.1994" IsCustomNameU="1" Name="Pin.1994" IsCustomName="1" Type="Group" Master="126" UniqueID="{216A72DB-F8E9-4C30-9C34-DE9A8448552B}">
<Cell N="PinX" V="0.07874015748031506" F="Sheet.1!Width*0.5"/>
<...etc>
<Shapes>
<Text callout and background shapes>
</Shapes>
</Shape>
<Shape ID="6" NameU="Pin.2002" IsCustomNameU="1" Name="Pin.2002" IsCustomName="1" Type="Group" Master="126">
<Cell N="PinX" V="0.07874015748031506" F="Sheet.1!Width*0.5"/>
<...etc>
<Section N="Property">
<Row N="Pin">
<Cell N="Value" V="2" U="STR"/>
</Row>
</Section>
<Shapes>
<Text callout and background shapes>
</Shapes>
</Shape>
</Shapes>
</Shape>
</Shapes>
</PageContents>
如果我将 "Pin" 属性 重命名为除“1”以外的任何名称,属性 将像在 Pin 2 上一样显示。我认为这是因为它是存储在主形状中,但主文件中也没有 "Property" 标签。
<MasterContents xmlns="http://schemas.microsoft.com/office/visio/2012/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xml:space="preserve">
<Shapes>
<Shape ID="5" Type="Group" LineStyle="0" FillStyle="0" TextStyle="0" UniqueID="{F811FFC2-FDBC-4EFF-97CF-13F5FFBC677C}">
<Cell N="PinX" V="0"/>
<...etc>
<Section N="User">...</Section>
<Section N="Geometry">...</Section>
<Shapes>
<Shape ID="6" NameU="Text callout" IsCustomNameU="1" Name="Text callout" IsCustomName="1" Type="Group" LineStyle="3" FillStyle="3" TextStyle="3" UniqueID="{4CF654FB-78A6-413C-A551-70A86FC63644}">...</Shape>
</Shapes>
</Shapes>
</MasterContents>
由于 Visio 正在显示值,因此它必须从某处获取 属性 名称和值,但我不知道它在哪里这样做。
当我解析文件时,我寻找 "Pin" 属性 并从形状中的其他属性中提取数据,但是当 "Pin" 属性 是不存在它将跳过文档中每个 Pin 1 的所有信息。
如果有人想看的话,我会在这里附上完整的 xml 文件。
*编辑:Zipfile with all XML files
*编辑2:VSDX file
感谢 vsdx,很有帮助。
正如您所强调的那样,'Pin1' 形状中的 Pin 形状数据行不会显示在实例形状 xml (PageContents) 中,因为它是从其母版继承的值。具有局部值的其他两个形状反映在实例中 xml.
我认为你遇到的问题是你看错了 master,所以找不到你想要的数据。
追溯的方法是,如果您查看页面 xml (page1.xml),您会看到 Pin 形状基于主 ID '6':
[注意 - 我在下面的片段中删除了很多 xml 以便更清楚地了解文件的结构。]
<PageContents>
<Shapes>
<Shape ID='17' Type='Group' LineStyle='7' FillStyle='7' TextStyle='7'>
<Shapes>
<Shape ID='5' NameU='Pin' Name='Pin' Type='Group' Master='6'>
现在您可以查看 masters 集合 (masters.xml),您会看到 ID 属性为 6 的大师('Pin' 大师)的 rel id 为 'rId2':
<Masters>
<Master ID='2' NameU='Dynamic connector' IsCustomNameU='1' Name='Dynamic connector' IsCustomName='1'>
<Rel r:id='rId1'/>
</Master>
<Master ID='6' NameU='Pin' IsCustomNameU='1' Name='Pin' IsCustomName='1'>
<Rel r:id='rId2'/>
</Master>
现在您已经获得了正确的 rel id,并在 master.xml.rels 中查找正确的主声明,您会看到 rel id 'rId2' 指向 master2.xml:
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master3.xml"/>
<Relationship Id="rId2" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master2.xml"/>
<Relationship Id="rId1" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master1.xml"/>
<Relationship Id="rId5" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master5.xml"/>
<Relationship Id="rId4" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master4.xml"/>
</Relationships>
所以您的最后一站是前往 master2.xml,在那里您应该会发现顶层形状 (id 5) 有一个名为 'Pin' 的形状数据行,其值为“1” :
<MasterContents>
<Shapes>
<Shape ID='5' NameU='Pin.473' IsCustomNameU='1' Name='Pin.473' IsCustomName='1' Type='Group'>
<Section N='Property'>
<Row N='Pin'>
<Cell N='Value' V='1' U='STR'/>
<Cell N='Prompt' V='' F='No Formula'/>
<Cell N='Label' V='Pin'/>
<Cell N='Format' V='' F='No Formula'/>
<Cell N='SortKey' V='' F='No Formula'/>
<Cell N='Type' V='0'/>
<Cell N='Invisible' V='0' F='No Formula'/>
<Cell N='Verify' V='0' F='No Formula'/>
<Cell N='DataLinked' V='0' F='No Formula'/>
<Cell N='LangID' V='sv-SE'/>
<Cell N='Calendar' V='0' F='No Formula'/>
</Row>
</Section>
我猜您将 vsdx 视为一个 zip,而您错过了 System.IO.Packaging 命名空间,这将帮助您浏览包关系。我会添加这个 link 以防万一:
我有一个程序可以解析 Visio 文件的 XML 数据。在此文件中,有一个由多个主控形状组成的分组形状。像这样:
每个形状都有一个 属性 叫做 Pin
Pin 1 是主形状中保存的默认值。当我解压缩 Visio 文件并查看 XML 数据时,"Pin" 属性 不会出现在引脚 1 上,但它会出现在所有其他引脚上。
<PageContents xmlns="http://schemas.microsoft.com/office/visio/2012/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xml:space="preserve">
<Shapes>
<Shape ID="2010" Type="Group" LineStyle="7" FillStyle="7" TextStyle="7" UniqueID="{B849B0B2-94FC-4CC7-843F-6A55BDBD37E6}">
<Cell N="PinX" V="8.484814432615094"/>
<...etc>
<Section N="Property">
<Row N="REF">
<Cell N="Value" V="X999" U="STR"/>
<...etc>
</Row>
</Section>
<Shapes>
<Shape ID="2" NameU="Pin.1994" IsCustomNameU="1" Name="Pin.1994" IsCustomName="1" Type="Group" Master="126" UniqueID="{216A72DB-F8E9-4C30-9C34-DE9A8448552B}">
<Cell N="PinX" V="0.07874015748031506" F="Sheet.1!Width*0.5"/>
<...etc>
<Shapes>
<Text callout and background shapes>
</Shapes>
</Shape>
<Shape ID="6" NameU="Pin.2002" IsCustomNameU="1" Name="Pin.2002" IsCustomName="1" Type="Group" Master="126">
<Cell N="PinX" V="0.07874015748031506" F="Sheet.1!Width*0.5"/>
<...etc>
<Section N="Property">
<Row N="Pin">
<Cell N="Value" V="2" U="STR"/>
</Row>
</Section>
<Shapes>
<Text callout and background shapes>
</Shapes>
</Shape>
</Shapes>
</Shape>
</Shapes>
</PageContents>
如果我将 "Pin" 属性 重命名为除“1”以外的任何名称,属性 将像在 Pin 2 上一样显示。我认为这是因为它是存储在主形状中,但主文件中也没有 "Property" 标签。
<MasterContents xmlns="http://schemas.microsoft.com/office/visio/2012/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xml:space="preserve">
<Shapes>
<Shape ID="5" Type="Group" LineStyle="0" FillStyle="0" TextStyle="0" UniqueID="{F811FFC2-FDBC-4EFF-97CF-13F5FFBC677C}">
<Cell N="PinX" V="0"/>
<...etc>
<Section N="User">...</Section>
<Section N="Geometry">...</Section>
<Shapes>
<Shape ID="6" NameU="Text callout" IsCustomNameU="1" Name="Text callout" IsCustomName="1" Type="Group" LineStyle="3" FillStyle="3" TextStyle="3" UniqueID="{4CF654FB-78A6-413C-A551-70A86FC63644}">...</Shape>
</Shapes>
</Shapes>
</MasterContents>
由于 Visio 正在显示值,因此它必须从某处获取 属性 名称和值,但我不知道它在哪里这样做。
当我解析文件时,我寻找 "Pin" 属性 并从形状中的其他属性中提取数据,但是当 "Pin" 属性 是不存在它将跳过文档中每个 Pin 1 的所有信息。
如果有人想看的话,我会在这里附上完整的 xml 文件。
*编辑:Zipfile with all XML files
*编辑2:VSDX file
感谢 vsdx,很有帮助。
正如您所强调的那样,'Pin1' 形状中的 Pin 形状数据行不会显示在实例形状 xml (PageContents) 中,因为它是从其母版继承的值。具有局部值的其他两个形状反映在实例中 xml.
我认为你遇到的问题是你看错了 master,所以找不到你想要的数据。
追溯的方法是,如果您查看页面 xml (page1.xml),您会看到 Pin 形状基于主 ID '6':
[注意 - 我在下面的片段中删除了很多 xml 以便更清楚地了解文件的结构。]
<PageContents>
<Shapes>
<Shape ID='17' Type='Group' LineStyle='7' FillStyle='7' TextStyle='7'>
<Shapes>
<Shape ID='5' NameU='Pin' Name='Pin' Type='Group' Master='6'>
现在您可以查看 masters 集合 (masters.xml),您会看到 ID 属性为 6 的大师('Pin' 大师)的 rel id 为 'rId2':
<Masters>
<Master ID='2' NameU='Dynamic connector' IsCustomNameU='1' Name='Dynamic connector' IsCustomName='1'>
<Rel r:id='rId1'/>
</Master>
<Master ID='6' NameU='Pin' IsCustomNameU='1' Name='Pin' IsCustomName='1'>
<Rel r:id='rId2'/>
</Master>
现在您已经获得了正确的 rel id,并在 master.xml.rels 中查找正确的主声明,您会看到 rel id 'rId2' 指向 master2.xml:
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master3.xml"/>
<Relationship Id="rId2" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master2.xml"/>
<Relationship Id="rId1" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master1.xml"/>
<Relationship Id="rId5" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master5.xml"/>
<Relationship Id="rId4" Type="http://schemas.microsoft.com/visio/2010/relationships/master" Target="master4.xml"/>
</Relationships>
所以您的最后一站是前往 master2.xml,在那里您应该会发现顶层形状 (id 5) 有一个名为 'Pin' 的形状数据行,其值为“1” :
<MasterContents>
<Shapes>
<Shape ID='5' NameU='Pin.473' IsCustomNameU='1' Name='Pin.473' IsCustomName='1' Type='Group'>
<Section N='Property'>
<Row N='Pin'>
<Cell N='Value' V='1' U='STR'/>
<Cell N='Prompt' V='' F='No Formula'/>
<Cell N='Label' V='Pin'/>
<Cell N='Format' V='' F='No Formula'/>
<Cell N='SortKey' V='' F='No Formula'/>
<Cell N='Type' V='0'/>
<Cell N='Invisible' V='0' F='No Formula'/>
<Cell N='Verify' V='0' F='No Formula'/>
<Cell N='DataLinked' V='0' F='No Formula'/>
<Cell N='LangID' V='sv-SE'/>
<Cell N='Calendar' V='0' F='No Formula'/>
</Row>
</Section>
我猜您将 vsdx 视为一个 zip,而您错过了 System.IO.Packaging 命名空间,这将帮助您浏览包关系。我会添加这个 link 以防万一: