Имея некоторые проблемы с возвратом определенных полей из запроса SOAP списка SharePoint.
Вот 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 Name="Title">New Item</Field>
ОБНОВИТЬ:
Я также могу получить атрибут "Имя" из элемента "Поле", но может только возвращать или устанавливать имя значения атрибута. Мне нужно иметь доступ к тесту в элементе "Поле".
Я могу получить значение атрибута следующим образом: System.out.println(field.getAttribute("Name").getValue());//Prints Title
System.out.println(field.getAttribute("Name").getValue());//Prints Title
И я могу получить это имя: System.out.println(field.getAttribute("Name").getName());//Prints Name
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, и он работает. Но если есть несколько элементов "Поле", с разными атрибутами, как я могу выбрать правильный через Jdom2?
Я могу это сделать: String title= field.getText();//returns New Item
String title= field.getText();//returns New Item
Но как я мог бы захватить текст из других элементов "Поле", которые используют атрибут "Имя"?
Спасибо за помощь 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());
}
Это все в пространствах имен. У вас их три, soap
, soap1
, а также пространство имен по умолчанию, которое в данном случае является "". JDOM обозначает это пространство имен как Namespace.NO_NAMESPACE.
Таким образом, чтобы получить элемент поля от updates
Element, вы можете сделать:
Element methods = updates.getChild("Method", Namespace.NO_NAMESPACE);
Element field = methods.getChild("Field", Namespace.NO_NAMESPACE);
Их можно упростить, если вы хотите, используя метод getChild, который вообще не имеет параметра пространства имен, например:
Element methods = updates.getChild("Method");
Element field = methods.getChild("Field");
Важно видеть, что ваш документ имеет 3 пространства имен и что элемент Field (и метод тоже) не находится в пространстве имен soap или soap1.
field
, вы можете получить либо атрибут, либо значение ... Но это не имеет смысла: "... пытаться получить значение в элементе поля для атрибута Name для заголовка". ... это не складывается.
<Field Name="Title">New Item</Field>