Jdom2 Sharepoint XML字段

时间:2014-09-26 17:00:48

标签: java xml sharepoint soap jdom-2

从SharePoint列表SOAP请求返回某些字段时遇到一些问题。

这是XML:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soap1="http://schemas.microsoft.com/sharepoint/soap/">
   <soap:Header/>
   <soap:Body>
      <soap1:UpdateListItems>
         <soap1:listName>69A3FFFA-782B-45D5-B776-2BE6D5645745</soap1:listName>
         <soap1:updates>
            <Batch OnError="Continue">
            <Method ID="1" Cmd="New">
                <Field Name="Title">New Item</Field>
            </Method>
            </Batch>
         </soap1:updates>
      </soap1:UpdateListItems>
   </soap:Body>
</soap:Envelope>

我可以使用以下Jdom2代码来获取这样的某些值:

            // set your name spaces.
            Namespace soap = Namespace.getNamespace("soap","http://www.w3.org/2003/05/soap-envelope");
            Namespace soap1 = Namespace.getNamespace("soap1","http://schemas.microsoft.com/sharepoint/soap/");

            // drill down into elements
            Element rootNode = doc.getRootElement();

            // Get Body node
            Element body = rootNode.getChild("Body",soap);
            // Get UpdateListItem Element
            Element UpdateListItems = body.getChild("UpdateListItems",soap1);
            // Get updates node
            Element updates = UpdateListItems.getChild("updates",soap1);

            // Set list name as String variable
            String listNameString = UpdateListItems.getChild("listName",soap1).getText();

            // Print list text value ** THIS WORKS**
            System.out.println(listNameString);

但是,我似乎无法弄清楚如何选择Field元素。 例如:我如何选择“标题”字段?

<Field Name="Title">New Item</Field>

更新:

我还可以从“Field”元素中获取属性“Name”,但只能返回或设置属性值的名称。我需要能够在“Field”元素中访问测试。

我可以像这样得到属性的值:     System.out.println(field.getAttribute("Name").getValue()); // Prints Title

我可以得到这样的名字:     System.out.println(field.getAttribute("Name").getName()); // Prints Name

但是,我需要能够返回元素的文本值。

更新2: 我没有提到。 XML真的是这样的:

`    <?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soap1="http://schemas.microsoft.com/sharepoint/soap/">
   <soap:Header/>
   <soap:Body>
      <soap1:UpdateListItems>
         <soap1:listName>69A3FFFA-782B-45D5-B776-2BE6D5645745</soap1:listName>
         <soap1:updates>
            <Batch OnError="Continue">
            <Method ID="1" Cmd="New">
                <Field Name="Title">New Item</Field>
                <Field Name="Classification" Type="Choice">Funny</Field>
                <Field Name="Title">New Item</Field>
                <Field Name="Title" Type="Text">Funny List Item</Field>
            </Method>
            </Batch>
         </soap1:updates>
      </soap1:UpdateListItems>
   </soap:Body>
</soap:Envelope>`

我可以通过SoapUI将其提交给SharePoint,它可以正常运行。但是如果有多个具有不同属性的“Field”元素,我如何通过Jdom2选择正确的元素?

我可以这样做:     String title = field.getText(); //returns New Item

但是,如何从其他使用“Name”属性的“Field”元素中获取文本?

2 个答案:

答案 0 :(得分:1)

全部在名称空间中。您有三个soapsoap1,还有默认命名空间,在这种情况下,它是&#34;&#34;。 JDOM将此命名空间指定为Namespace.NO_NAMESPACE。

因此,要从updates元素获取字段元素,您可以执行以下操作:

Element methods = updates.getChild("Method", Namespace.NO_NAMESPACE);
Element field = methods.getChild("Field", Namespace.NO_NAMESPACE);

如果需要,可以通过使用根本没有namespace参数的getChild方法使这些更简单,例如:

Element methods = updates.getChild("Method");
Element field = methods.getChild("Field");

这里要看的重要一点是,您的文档有3个名称空间,而Field元素(以及Method也不在soap或soap1名称空间中)。

答案 1 :(得分:0)

感谢帮助rolfl。我想到了。您可以遍历Child元素以访问不同的“Field”属性。然后,我测试属性名称以获取或设置其内容。这是我能想到的最好的。

    for (Element node : method.getChildren("Field")){ 
        if(node.getAttributeValue("Name").equalsIgnoreCase("Title")){
            node.setText("String");
        }
        System.out.println(node.getAttribute("Name").getValue());
    }