Как читать в XML из веб-службы и запрашивать атрибуты набора строк в C #? - PullRequest
1 голос
/ 16 марта 2012

Вот пример XML, который я получаю от веб-службы.

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
    <s:AttributeType name='NAME' rs:number='1'>
        <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='25'
         rs:maybenull='false'/>
    </s:AttributeType>
    <s:AttributeType name='DESCRIPTION' rs:number='2' rs:nullable='true'
         rs:writeunknown='true'>
        <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='80'/>
    </s:AttributeType>
    <s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row NAME='JOE BLOW' DESCRIPTION='PROGRAMMER'/>
<z:row NAME='ANN SMITH' DESCRIPTION='FRONT DESK'/>
<z:row NAME='STEVE JOHNSON' DESCRIPTION='TESTER'/>
</rs:data>
</xml>

Я не уверен, как добраться до узла <rs:data>.В конце концов я хочу перечислить каждый <z:row> и получить атрибуты NAME и DESCRPTION.Веб-сервис возвращает это мне в виде строки, поэтому я загружаю строку в XMLDocument следующим образом:

XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xmlString);

Теперь я не уверен, нужно ли мне использовать XmlNamespaceManager для того, чтобы позвонить моемуxDoc для импорта <s:Schema>

Я попытался выбрать один узел с XPath безуспешно из-за префикса rs.

XmlNode xNode = xDoc.SelectSingleNode("/rs:data");

Если есть ещенеобходима информация, пожалуйста, спросите.

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

Если вы воспринимаете xml как строку, попробуйте выполнить ее разбор вместо использования Load ()

var xml = XDocument.Parse(xmlstring);

Вы должны использовать пространство имен, чтобы получить данные должным образом.

XNamespace ns = "#RowsetSchema";

foreach (var element in xml.Descendants().Elements(ns + "row"))
{
    Console.WriteLine ("Name = " + element.Attribute("NAME").Value + ", " + "Description = " + element.Attribute("DESCRIPTION").Value); 
}
1 голос
/ 16 марта 2012

Используя xml с linq, это можно сделать так:

XDocument xmlDoc = new XDocument();
xmlDoc = XDocument.Parse(xml);

XNamespace ns = "#RowsetSchema";

var namesDescs = from namesDesc in xmlDoc.Descendants().Elements(ns + "row")
    select new
    {
       name = namesDesc.Attribute("NAME").Value,
       description = namesDesc.Attribute("DESCRIPTION").Value,
    };
1 голос
/ 16 марта 2012

Вот несколько классов для обработки вашего xml с использованием этих расширений: http://searisen.com/xmllib/extensions.wiki

public class Test
{
    XElement self;
    public Test(XElement self)
    {
        this.self = self;
    }

    public RSDataRow[] DataRows
    {
        get
        {
            if (null == _DataRows)
            {
                _DataRows = self.GetEnumerable("rs:data/z:row", xrow => new RSDataRow(xrow)).ToArray();
            }
            return _DataRows;
        }
    }
    RSDataRow[] _DataRows;
}

[DebuggerDisplay("{Name}")]
public class RSDataRow
{
    XElement self;
    public RSDataRow(XElement self)
    {
        this.self = self;
    }

    public string Name
    {
        get { return self.Get("NAME", string.Empty); }
    }

    public string Description
    {
        get { return self.Get("DESCRIPTION", string.Empty); }
    }
}

Вы используете это как:

Test test = new Test(XElement.Parse(xmlstring));
foreach (RSDataRow row in test.DataRows)
{
    string name = row.Name;
    string desc = row.Description;
}
...