我有一个程序来解析Visio文件的XML数据。在此文件中,有一个由几个主要形状组成的分组形状。像这样:
每个形状都有一个称为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上一样显示。我认为这是因为它存储在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文件。
*编辑:Zipfile with all XML files
* Edit2:VSDX file
答案 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命名空间,这将有助于您浏览包关系。我会添加此链接,以防万一: