Где хранятся свойства Visio Master Shape? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть программа, которая анализирует XML-данные файла Visio.В этом файле есть сгруппированная фигура, состоящая из нескольких основных фигур.Например: 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» отсутствует, оно пропускает всю эту информацию для каждого Pin1 в документе.

Я приложу сюда полные xml-файлы, если кто-нибудь захочет на них посмотреть.

Свойство переименовано в "1"

Отсутствует свойство

Master126

* Редактировать: Zip-файл со всеми файлами XML

* Edit2: VSDX файл

1 Ответ

0 голосов
/ 18 декабря 2018

Спасибо за vsdx, это полезно.

Как вы отметили, строка данных формы штыря в форме 'Pin1' не отображается в форме экземпляра xml (PageContents), поскольку она является унаследованным значениемот своего хозяина.Две другие фигуры, имеющие локальные значения, отражаются в экземпляре xml.

Я думаю, что проблема, с которой вы столкнулись, заключается в том, что вы смотрите на неправильный мастер и не находите нужные данные.

Способ отследить это можно, если вы посмотрите на страницу xml (page1.xml) и увидите, что форма Pin основана на основном идентификаторе '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.xml) и увидит, что мастер с атрибутом ID 6 (мастер 'Pin') имеет идентификатор Rel '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 в 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 как почтовый индекс и что вы упускаете пространство имен System.IO.Packaging, которое будетпомочь вам с навигацией по пакетным отношениям.Я добавлю эту ссылку на всякий случай:

...