Visio Master Shape属性存储在哪里?

时间:2018-12-16 14:48:23

标签: c# xml visio

我有一个程序来解析Visio文件的XML数据。在此文件中,有一个由几个主要形状组成的分组形状。像这样: Connector X999
每个形状都有一个称为Pin

的属性

Pin 1 of connector
引脚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上一样显示。我认为这是因为它存储在Master Shape中,但是没有“ 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”属性中每个Pin 1的所有信息。文档。

如果有人想看看它们,我将在此处附加完整的xml文件。

Property renamed to "1 "

Property missing

Master126

*编辑:Zipfile with all XML files

* Edit2:VSDX file

1 个答案:

答案 0 :(得分:1)

感谢vsdx,这很有帮助。

突出显示,“ Pin1”形状的“销形数据”行未显示在实例形状xml(PageContents)中,因为它是其母版的继承值。具有局部值的其他两种形状反映在实例xml中。

我认为您遇到的问题是您正在寻找错误的主服务器,而找不到要获取的数据。

追溯此问题的方法是,如果查看页面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的master(“ Pin” master)具有相对的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'的Shape Data行且值为'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命名空间,这将有助于您浏览包关系。我会添加此链接,以防万一: