XDocument Получить часть XML-файла - PullRequest
3 голосов
/ 05 августа 2009

У меня большой XML-файл, и я хочу получить из него определенное количество <Cooperation> узлов. Какой лучший способ справиться с этим.

В настоящее время я использую этот код

public string FullCooperationListChunkGet(int part, int chunksize)
{
    StringBuilder output_xml = new StringBuilder();
    IEnumerable<XElement> childList = from el in xml.Elements("Cooperations").Skip(part * chunksize).Take(chunksize) select el;

    foreach (XElement x in childList.Elements())
    {
        output_xml.Append(x.ToString());
    }

    return output_xml.ToString();
}

Skip(part * chunksize).Take(chunksize) не работает (кажется, действует только для тега сотрудничества, а не тега сотрудничества)

Может кто-нибудь направить меня в правильном направлении.

Спасибо
Rayt

Edit:
Фон таков: я отправляю эти части XML через веб-сервис в Blackberry. К сожалению, размер http-запроса на корпоративном сервере Blackberry ограничен до 256 кб по умолчанию.

Часть файла XML:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Cooperations>
  <Cooperation>
    <CooperationId>xxx</CooperationId>
    <CooperationName>xxx</CooperationName>
    <LogicalCustomers>
      <LogicalCustomer>
        <LogicalCustomerId>xxx</LogicalCustomerId>
        <LogicalCustomerName>xxx</LogicalCustomerName>
        <Customers>
          <Customer>
            <CustomerId>xxx</CustomerId>
            <CustomerName>xxx/CustomerName>
          </Customer>
          <Customer>
            <CustomerId>xxx</CustomerId>
            <CustomerName>xxx</CustomerName>
          </Customer>
        </Customers>
      </LogicalCustomer>
      <LogicalCustomer>
        <LogicalCustomerId>xxx</LogicalCustomerId>
        <LogicalCustomerName>xxx</LogicalCustomerName>
        <Customers>
          <Customer>
            <CustomerId>xxx</CustomerId>
            <CustomerName>xxx</CustomerName>
          </Customer>
          <Customer>
            <CustomerId>xxx</CustomerId>
            <CustomerName>xxx</CustomerName>
          </Customer>
        </Customers>
      </LogicalCustomer>
      <LogicalCustomer>
        <LogicalCustomerId>xxx</LogicalCustomerId>
        <LogicalCustomerName>xxx</LogicalCustomerName>
        <Customers>
          <Customer>
            <CustomerId>xxx</CustomerId>
            <CustomerName>xxx</CustomerName>
          </Customer>
        </Customers>
      </LogicalCustomer>
    </LogicalCustomers>
  </Cooperation>
  <Cooperation>
  ...

Ответы [ 3 ]

2 голосов
/ 05 августа 2009

Для использования XDocument я ожидаю, что вы захотите что-то вроде:

var qry = doc.Root.Elements("Cooperation").Skip(part*chunksize).Take(chunksize);

однако, если данные большие , вам, возможно, придется перейти на XmlReader вместо ... Я попробую сделать пример ... (обновление; 512 КБ, вероятно, стоит ...)

Проблема с вашим кодом в том, что вы используете .Elements() здесь:

foreach (XElement x in childList.Elements())
{
    output_xml.Append(x.ToString());
}

Просто удалите это:

foreach (XElement x in childList)
{
    output_xml.Append(x.ToString());
}

Для информации - вы также без необходимости используете синтаксис запроса:

IEnumerable<XElement> childList = from el in xml.Elements("Cooperations")
    .Skip(part * chunksize).Take(chunksize) select el;

на 100% идентичен:

IEnumerable<XElement> childList = xml.Elements("Cooperations")
    .Skip(part * chunksize).Take(chunksize);

(поскольку компилятор игнорирует очевидное select, без привязки его к методу Select LINQ)

1 голос
/ 05 августа 2009

У вас есть XML-документ или фрагмент, т. Е. У вас более 1 узла "Сотрудничество"? Если у вас есть больше, какую кооперацию вы ожидаете получить? От всего 1 Сотрудничества или через несколько, причина для того, чтобы спросить, что вы написали xml.Element s («Сотрудничество»).

Разве это не поможет?

xml.Element("Cooperations").Elements("Cooperation").Skip(...).Take(...)
0 голосов
/ 15 сентября 2014

Вы можете сделать это, используя System.Net вместо LINQ, хотя это будет довольно грязно. Просто чтобы дать вам представление о том, как вы можете прочитать части ответа http:

// Get the HTTP response
string url = "http://someurl.com/myxml.xml";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Build a stream
Stream stream = response.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader reader = new StreamReader( stream, encode );

// Loop the file
Char[] read = new Char[256];
int count = reader.Read( read, 0, 256 );
while (count > 0) {
    String str = new String(read, 0, count);
    count = reader.Read(read, 0, 256);
}
response.Close();
stream.Close();

Пейджинг можно использовать, настроив count и одновременно выполнив поиск str тегов XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...