linq to xml и пространства имен - PullRequest
0 голосов
/ 01 мая 2010

Я всегда очень рад получить возможность использовать linq to xml, а затем столкнулся с той же проблемой PITA с пространствами имен. Не уверен, что со мной не так, но я не могу понять, что происходит. По сути, мне просто нужно получить значение элемента responseCode, и пока мне не повезло: (

<?xml version="1.0" encoding="IBM437"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
 <soapenv:Body>
   <ns1:ActionResponse xmlns:ns1="http://cbsv.ssa.gov/ws/datatype">
     <ns1:responseCode>0000</ns1:responseCode>
     <ns1:responseDescription>Successful</ns1:responseDescription>
   </ns1:ActionResponse>
 </soapenv:Body>
</soapenv:Envelope>

Ответы [ 2 ]

2 голосов
/ 01 мая 2010

Пространства имен в LINQ to XML действительно элегантно обрабатываются, IMO. Вот пример:

XNamespace ns1 = "http://cbsv.ssa.gov/ws/datatype";
XDocument doc = XDocument.Load(...);
string code = doc.Descendants(ns1 + "responseCode")
                 .Select(x => (string) x)
                 .First();

Если вы хотите работать сверху вниз, используя оба задействованных пространства имен, это тоже нормально:

XNamespace ns1 = "http://cbsv.ssa.gov/ws/datatype";
XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
XDocument doc = XDocument.Load(...);
string code = (string) doc.RootElement
                          .Element(soapenv + "Body")
                          .Element(ns1 + "ActionResponse")
                          .Element(ns1 + "responseCode");

Просто чтобы прояснить, ничто не заставляет использовать то же имя переменной, что и префикс пространства имен в XML - я только что сделал для ясности.

0 голосов
/ 30 апреля 2012

С XML, как это:

<esri:DataElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:esri="http://www.esri.com/schemas/ArcGIS/10.0" xsi:type="esri:DEFeatureClass">
  <CatalogPath>\counties</CatalogPath>
  <Name>counties</Name>

…

</esri:DataElement>

Я использовал такие запросы, как:

tableInfo.TableName = (from element in xDoc.Descendants("Name")
                                                   select Convert.ToString(element.Value)).FirstOrDefault();

Но если вы определите пространство имен в своем коде, то вы можете получить более конкретный, более быстрый:

XNamespace esri = "http://www.esri.com/schemas/ArcGIS/10.0";

tableInfo.TableName = xDoc.Element(esri + "DataElement").Element("Name").Value;

Вы можете думать о том, чтобы объявить пространство имен как место «esri:» в строках. (Также нельзя использовать двоеточие в запросе). Кроме того, в файле, подобном этому, я обнаружил несколько вхождений тегов, поэтому важно получить правильные (или хотя бы один набор). Раньше я заканчивал с избыточной информацией для полей, что могло бы испортить создание таблицы SQL Server. Теперь я могу определить, какой элемент я хочу связать с корнем документа.

...