1

我有一个目录,里面全是 XML 格式的 salesforce 对象。我想确定<fullName>所有自定义的父文件在<fields>哪里<required>是真的。这是一些截断的示例数据,我们称之为“Custom_Object__c:

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
<deprecated>false</deprecated>
<description>descriptiontext</description>
<fields>
    <fullName>custom_field1</fullName>
    <required>false</required>
    <type>Text</type>
    <unique>false</unique>
</fields>
<fields>
    <fullName>custom_field2</fullName>
    <deprecated>false</deprecated>
    <visibleLines>5</visibleLines>
</fields>
<fields>
    <fullName>custom_field3</fullName>
    <required>false</required>
</fields>
<fields>
    <fullName>custom_field4</fullName>
    <deprecated>false</deprecated>
    <description>custom field 4 description</description>
    <externalId>true</externalId>
    <required>true</required>
    <scale>0</scale>
    <type>Number</type>
    <unique>false</unique>
</fields>
<fields>
    <fullName>custom_field5</fullName>
    <deprecated>false</deprecated>
    <description>Creator of this log message. Application-specific.</description>
    <externalId>true</externalId>
    <label>Origin</label>
    <length>255</length>
    <required>true</required>
    <type>Text</type>
    <unique>false</unique>
</fields>
<label>App Log</label>
<nameField>
    <displayFormat>LOG-{YYYYMMDD}-{00000000}</displayFormat>
    <label>Entry ID</label>
    <type>AutoNumber</type>
</nameField>
</CustomObject>

所需的输出将是格式如下的字典:

required_fields =  {'Custom_Object__1': 'custom_field4', 'Custom_Object__1': 'custom_field5',... etc for all the required fields in all files in the fold.}

或任何类似的东西。

我已经通过 glob.glob 获得了我的对象列表,并且我可以使用 ElementTree 获得所有子项及其属性的列表,但我正在努力过去。我觉得我已经很接近了,但我希望能帮我完成这项任务。到目前为止,这是我的代码:

import os
import glob
import xml.etree.ElementTree as ET

os.chdir("/Users/paulsallen/workspace/fforce/FForce Dev Account/config/objects/")
objs = []


for file in glob.glob("*.object"):
    objs.append(file)

fields_dict = {}

for object in objs:
    root = ET.parse(objs).getroot()

....

一旦我得到解析的 XML 数据,我不知道从那里获取它。

4

2 回答 2

3

您真的想切换到使用lxml这里,因为您可以使用 XPath 查询:

from lxml import etree as ET

os.chdir("/Users/paulsallen/workspace/fforce/FForce Dev Account/config/objects/")
objs = glob.glob("*.object")

fields_dict = {}

for filename in objs:
    root = ET.parse(filename).getroot()
    required = root.xpath('.//n:fullName[../n:required/text()="true"]/text()',
        namespaces={'n': tree.nsmap[None]})
    fields_dict[os.path.splitext(filename)[0]] = required

使用该代码,您最终会得到一个列表字典;每个键都是一个文件名(没有扩展名),每个值都是一个必填字段列表。

XPath 查询fullName在默认命名空间中查找元素,这些required元素具有与其中的文本同级的元素'true'。然后它获取每个匹配元素的包含文本,这是我们可以存储在字典中的列表。

于 2013-02-22T11:01:44.830 回答
0

使用此功能查找给定根目录下的所有必填字段。它还应该有助于作为未来解析需求的示例/起点

def find_required_fields(root):
    NS = {'soap': 'http://soap.sforce.com/2006/04/metadata'}
    required_fields = []
    for field in root.findall('soap:fields', namespaces=NS):
        required = field.findtext('soap:required', namespaces=NS) == "true"
        name = field.findtext('soap:fullName', namespaces=NS)
        if required:
            required_fields.append(name)
    return required_fields

示例用法:

>>> import xml.etree.ElementTree as ET
>>> root = ET.parse('objects.xml') # where objects.xml contains the example in the question
>>> print find_required_fields(root)
['custom_field4', 'custom_field5']
>>>
于 2013-02-22T10:51:54.163 回答