0

我正在对服务器进行外部调用并返回 XML (HTTPResponse)。然后我使用 DOM 解析器来获取项目列表。如何将项目列表添加到 DataTable/DataList?

如何将 XML 结构解析为类本身内的 Salesforce 结构?

谢谢

嗨,尖叫。一切正常,除了一件事。我需要深入了解 XML

Dom.XMLNode rootElement = doc.getRootElement();
for (Dom.XmlNode assets : rootElement.getChildElements()) {
    if (assets.getName().trim() == 'models') {
        for (Dom.XmlNode asset : assets.getChildElements()) {
            if (asset.getName().trim() == 'model') {
                for (Dom.XmlNode serial : asset.getChildElements()) {
                    if (serial.getName().trim() == 'modelNumber') {
                        text = serial.getText().trim();
                        allOptons.add(new SelectOption(text, text));
                    }
                }
            }
        }
    }
}

在 VF 页面上,它会复制结果。为什么?

4

1 回答 1

1

如果您需要存储超过 1 个参数,请通过您的 XML 将元素添加到包装器对象的字符串列表中。然后可以将这样的列表分配给 dataTable、pageBlockTable、repeat 等标签而没有任何问题。这些标签并非只适用于标准 sObjects。

对于带有复选框的简单字符串列表,您甚至不需要任何辅助类。

public class StackXml{
    public List<SelectOption> allOptions {get;private set;}    // this will hold serial numbers for use in VF page.
    // if you wouldn't plan to use VF with checkboxes, simple List<String> would be enough

    public List<String> selectedOptions {get;set;}

    public StackXml(){
        allOptions = new List<SelectOption>();
        selectedOptions = new List<String>();

        String xmlString = '<serials><serialNumber>ver123</serialNumber><serialNumber>ver456 </serialNumber>' +
            '<intrusion>something to prove it will be skipped</intrusion>' +
            '<serialNumber>abc007</serialNumber></serials>';

        Dom.Document doc = new Dom.Document();
        doc.load(xmlString);

        Dom.XMLNode rootElement = doc.getRootElement();
        for(Dom.XmlNode node : rootElement.getChildElements()){
            if(node.getName().trim() == 'serialNumber') {
                String text = node.getText().trim();
                allOptions.add(new SelectOption(text, text));
            }
        }
    }

    public void assign(){}
}

<apex:page controller="StackXml">
    <apex:form>
        <apex:selectCheckboxes value="{!selectedOptions}" layout="pageDirection">
            <apex:selectOptions value="{!allOptions}"/>
        </apex:selectCheckboxes>
        <apex:commandButton value="Assign" action="{!assign}"/>
    </apex:form>
    <hr/>
    <p>You have selected:</p>
    <apex:dataList value="{!selectedOptions}" var="o">{!o}</apex:dataList>
</apex:page>
于 2012-11-05T22:21:02.790 回答