Как установить значение элемента с пространством имен в linq? - PullRequest
0 голосов
/ 03 января 2012

Я занимаюсь разработкой веб-части silverlight для sharepoint 2010. У меня есть xml-файл в приложении:

<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="67" uniqueCount="39">
  <si>
    <t>INVOICE</t>
  </si>
  <si>
    <t>INVOICE #</t>
  </si>
  <si>
    <t>Bill To:</t>
  </si>
  <si>
    < t>DESCRIPTION</t>
  </si>
  <si>
    <t>AMOUNT</t>
  </si>
  <si>
    <t>TOTAL</t>
  </si>
  <si>
    <t>FOR:</t>
  </si>
  <si>
    <t>Positive Behavior Support Corp</t>
  </si>
  <si>
    <t>8108 SE Coconut St.</t>
  </si>
  <si>
    <t>Hobe Sound, FL 33455</t>
  </si>
  <si>
    <t>772-349-6317 Phone  772-675-9100 Fax</t>
  </si>
  <si>
    <t>EIN 20-5268843</t>
  </si>
  <si>
    <t>Provider 693068996</t>
  </si>
  <si>
    <t>Rate</t>
  </si>
  <si>
    <t>Units</t>
  </si>
  <si>
    <t>DATE</t>
  </si>
  <si>
    <t>Michael Nolan Ph.D. BCBA</t>
  </si>
  <si>
    <t>____________________________________________</t>
  </si>
  <si>
    <t>BCBA                          Date</t>
  </si>
  <si>
    <t>CLIENT:</t>
  </si>
  <si>
    <t>Date:</t>
  </si>
  <si>
    <t>Behavior Assistant- L. Bresson</t>
  </si>
  <si>
    <t>Email:</t>
  </si>
  <si>
    <t>1 Unit = 1 hour</t>
  </si>
  <si>
    <t>TOTALS</t>
  </si>
  <si>
    <t>cvt1970@juno.com</t>
  </si>
  <si>
    <t>Attn: Cecilia</t>
  </si>
  <si>
    <t>Behavior Assistant- B. Bresson</t>
  </si>
  <si>
    <t>Behaviror Ass't -N Giarratano</t>
  </si>
  <si>
    <t>Signature of Representatives Approval           Date</t>
  </si>
  <si>
    <r>
      <t xml:space="preserve">Behavior Asst- </t>
    </r>
    <r>
      <rPr>
        <sz val="9" />
        <rFont val="Arial" />
        <family val="2" />
      </rPr>
      <t>N Giarratano-</t>
    </r>
    <r>
      <rPr>
        <sz val="10" />
        <rFont val="Arial" />
        <family val="2" />
      </rPr>
      <t>08</t>
    </r>
  </si>
  <si>
    <t>Behavior Asst- B. Bresson-08</t>
  </si>
  <si>
    <t>Behavior Asst- L. Bresson-08</t>
  </si>
  <si>
    <t>&lt;@Invoice&gt;</t>
  </si>
  <si>
    <t>&lt;@For&gt;</t>
  </si>
  <si>
    <t>&lt;@Client&gt;</t>
  </si>
  <si>
    <t>&lt;@Caregiver&gt;</t>
  </si>
  <si>
    <t>&lt;@Email,@Address,@City,@State,@Zip&gt;</t>
  </si>
  <si>
    <t>&lt;@Date&gt;</t>
  </si>
</sst>

Я успешно загружаю этот xml-файл.Теперь я обрабатываю все элементы с именем "t" из XML-файла следующим образом.

XNamespace ns = xmlDoc.Root.Name.Namespace;
            var eles = from c in xmlDoc.Descendants(ns + "si")
                       select c.Element(ns + "t");

Он также работает нормально.Но когда я использую следующий запрос, он дает мне ошибку

eles.Elements(ns + "t").Where(x => x.Element(ns + "t").Value == "&lt;@Date&gt;").SingleOrDefault().SetElementValue(ns + "t","hi");

Это дает мне ошибку, так как ссылка на объект не установлена ​​на экземпляр объекта.Как я могу заменить "<@Date>" на "hi" в существующем xml. Не могли бы вы предоставить мне любой код или ссылку, с помощью которых я могу решить вышеуказанную проблему?

Ответы [ 2 ]

1 голос
/ 03 января 2012

Ваша переменная eles уже возвращает <t>. Ни один из <t> не имеет дочернего элемента, который является <t>, поэтому имеет смысл, что x.Element(ns + "t") ничего не возвращает (таким образом, null, следовательно, .Value является ошибкой). На самом деле, я немного запутался, потому что eles.Elements(ns + "t") должна была быть пустой последовательностью.

Кроме того, значение в терминах C # равно <@Date>; &gt; / &lt; относится только к XML.

Кроме того, на запрос влияет тот, который <si> не имеет <t>; лучший вариант будет:

var eles = xmlDoc.Descendants(ns + "si").Elements(ns + "t");

(который обрабатывает 0, 1 или много <t> за <si>)

Тогда после этого вы имеете в виду:

eles.SingleOrDefault(x => x.Value == "<@Date>").Value = "hi";
0 голосов
/ 03 января 2012

Ваш первый запрос возвращает элементы с именем 't', второй запрос затем ищет дочерние элементы этих элементов, также с именем 't'.Это не соответствует структуре вашего документа. Ваш второй запрос должен быть следующим:

var matchingElement = eles.SingleOrDefault(x => x.Value == "&lt;@Date&gt;");

Затем вы можете выполнить замену.

Я бы порекомендовал использовать ваш отладчик при разработке кода.Если вы установите точку останова, то проверьте переменную eles, и вы увидите, что возвращает ваш первый запрос.

...