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 文件。

Property renamed to "1 "

Property missing

Master126

*编辑: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 以防万一: