#c# #xml #syndication #syndication-item
#c# #xml #объединение #syndication-item
Вопрос:
Даже не уверен, задаю ли я правильный вопрос, но вот оно. В основном из-за отсутствия поддержки клиентом WCF DS для «глубоких вставок OData» мне приходится вручную создавать запрос Atom. У меня запрос почти завершен, единственное, чего не хватает (и это вызывает проблему при запросе на сервер), — это добавить префикс пространства имен к узлу «запись» в XML-запросе.
Я использую SyndicationItem для создания запроса. Мне нужно добавить к узлу «entry» префикс «atom:», чтобы сервер принял запрос…
Любая помощь очень ценится. Вот запрос, который генерируется сейчас:
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns:atom="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
<atom:id>uuid:8ed93950-9c16-4923-b6cc-ca5c7d020709;id=1</atom:id>
<atom:title type="text"></atom:title>
<atom:updated>2011-11-03T23:02:40Z</atom:updated>
<atom:link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/SalesOrderItems" type="application/atom xml;type=feed" title="SALES_ORDER.SalesOrderHeader_SalesOrderItemsx" href="SalesOrderHeaders()/SalesOrderItems">
<m:inline>
<atom:feed>
<atom:entry>
<atom:content>
<m:properties>
<d:Item>10</d:Item>
<d:Material>70000559</d:Material>
<d:Plant>570B</d:Plant>
<d:Quantity>10</d:Quantity>
</m:properties>
</atom:content>
</atom:entry>
<atom:entry>
<atom:content>
<m:properties>
<d:Item>20</d:Item>
<d:Material>70000559</d:Material>
<d:Plant>570B</d:Plant>
<d:Quantity>10</d:Quantity>
</m:properties>
</atom:content>
</atom:entry>
</atom:feed>
</m:inline>
</atom:link>
<atom:content type="text/xml">
<m:properties>
<d:DocumentType>ZCSH</d:DocumentType>
<d:CustomerId>0001008657</d:CustomerId>
<d:SalesOrg>1100</d:SalesOrg>
<d:DistChannel>10</d:DistChannel>
<d:Division>40</d:Division>
</m:properties>
</atom:content>
</entry>
И вот код, который у меня есть прямо сейчас для генерации запроса. Это просто доказательство концепции, поэтому, пожалуйста, игнорируйте дерьмо. 🙂
XNamespace nsAtom = "http://www.w3.org/2005/Atom";
XNamespace nsD = "http://schemas.microsoft.com/ado/2007/08/dataservices";
XNamespace nsM = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
SyndicationItem soHeader = new SyndicationItem();
soHeader.AttributeExtensions.Add(new XmlQualifiedName("atom", XNamespace.Xmlns.ToString()), nsAtom.NamespaceName);
soHeader.AttributeExtensions.Add(new XmlQualifiedName("d", XNamespace.Xmlns.ToString()), nsD.NamespaceName);
soHeader.AttributeExtensions.Add(new XmlQualifiedName("m", XNamespace.Xmlns.ToString()), nsM.NamespaceName);
soHeader.Content = SyndicationContent.CreateXmlContent(
new XElement(nsM "properties",
new XElement(nsD "DocumentType", "ZCSH"),
new XElement(nsD "CustomerId", "0001008657"),
new XElement(nsD "SalesOrg", "1100"),
new XElement(nsD "DistChannel", "10"),
new XElement(nsD "Division", "40")
)
);
SyndicationLink link = SyndicationLink.CreateAlternateLink(new Uri("SalesOrderHeaders()/SalesOrderItems", UriKind.Relative), "application/atom xml;type=feed");
link.Title = "SALES_ORDER.SalesOrderHeader_SalesOrderItems";
link.RelationshipType = "http://schemas.microsoft.com/ado/2007/08/dataservices/related/SalesOrderItems";
soHeader.Links.Add(link);
XElement items = new XElement(nsM "inline",
new XElement(nsAtom "feed")
);
for (int i = 0; i < 2; i )
{
items.Element(nsAtom "feed").Add(new XElement(nsAtom "entry",
new XElement(nsAtom "content",
new XElement(nsM "properties",
new XElement(nsD "Item", ((i 1)*10).ToString()),
new XElement(nsD "Material", "70000559"),
new XElement(nsD "Plant", "570B"),
new XElement(nsD "Quantity", (Decimal)10.0)
)
)
)
);
}
link.ElementExtensions.Add(items);
XmlWriter xml = XmlWriter.Create("C:\test.xml");
soHeader.SaveAsAtom10(xml);
xml.Close();
Ответ №1:
Элемент entry находится в пространстве имен ATOM, как и должно быть, он просто не использует какой-либо префикс. Если вы удалите объявление пространства имен с префиксом atom, который вы добавляете вручную, все элементы ATOM по-прежнему будут находиться в пространстве имен ATOM, но без префикса atom. Обратите внимание, что entry elements объявляет пространство имен по умолчанию как пространство имен ATOM. Любой сервер, совместимый с XML, должен иметь возможность считывать эту полезную нагрузку. Удаление префикса atom просто уменьшит полезную нагрузку.
Комментарии:
1. Я думаю, проблема в том, что сервер неправильно обрабатывает полезную нагрузку. Я думаю, что для этого требуется префикс для всех элементов. Есть ли способ принудительно ввести префикс для этого элемента ввода? Спасибо