xml изменение значения атрибута - PullRequest
2 голосов
/ 11 марта 2010

У меня есть следующий текст в XML-файле:

<Config Builder="LP Wizard">
    <Libraries>
        <Library Name="XCAMSource"/>
    </Libraries>
    <InputFormats>
        <XCAM Format="XCAM" LibraryDirectory="C:\XCAM"/>
    </InputFormats>
    <OutputFormats>
        <Pads Version="PADS 5.0" ExportAscii="false" LibraryGenerate="true" ExtendedLayers="false" AlphaLoc="PART TYPE" Format="PADS" LibraryDirectory="c:\XCAM\OUTPUT" DirectoryStructure="false" Units="Millimeters" NewCodeVersion="false" usrLayerNameElecT="1" usrLayerNameElecB="2" usrLayerNameSilk="26" usrLayerNameSilkb="29" usrLayerNameCY="20" usrLayerName3D="25" usrLayerNameAssy="27" usrLayerNameAssyb="30" usrLayerNamePmask="23" usrLayerNameSmask="21" usrLayerNameSmaskb="28" DirectImport="false"/>
    </OutputFormats>
</Config>

Мне нужно изменить текст «C: \ XCAM», который находится под LibraryDirectory=.

Что такое умный способ сделать это, я просто не хочу искать строку для LibraryDirectory= а затем поискать первый и последний ", а затем изменить текст между.

Ответы [ 3 ]

7 голосов
/ 11 марта 2010
var doc = XDocument.Load("test.xml");
doc.Root.Element("XCAM").Attribute("LibraryDirectory").Value = "new value";
doc.Save("test.xml");

UPDATE:

doc.Root
   .Element("InputFormats")
   .Element("XCAM")
   .Attribute("LibraryDirectory").Value = "new value";

или с использованием XPATH:

doc.XPathSelectElement("//InputFormats/XCAM")
   .Attribute("LibraryDirectory").Value = "new value";

Не забудьте добавить использование System.Xml.XPath, так как XPathSelectElement - это метод расширения.

0 голосов
/ 11 марта 2010

Вы можете передать XML через эту простую таблицу стилей XSL:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
>
  <!-- the identity template copies everything verbatim -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>
  <!-- only LibraryDirectory attributes get a new value -->
  <xsl:template match="@LibraryDirectory">
    <xsl:copy>
      <xsl:value-of select="'the text here to be changed'" />
    </xsl:copy>
  </xsl:template>
</xsl:stylessheet>

Чтобы применить таблицу стилей к вашему XML-документу, вы можете использовать XslCompiledTransform класс .

0 голосов
/ 11 марта 2010

Вы можете загрузить файл в XmlDocument, выбрать атрибут с помощью XPath и записать его обратно. Это намного более сложное, но, вероятно, «правильное» решение для производственного кода.

Если вам нужно заменить несколько файлов или несколько экземпляров, RegEx может быть более простым вариантом - скорее всего, это будет более быстрый и короткий код, но он не такой описательный. Если то, что вы делаете, это (скажем) написание инструмента для непроизводственного использования (скажем, для преобразования набора файлов конфигурации для использования на разных машинах), это, вероятно, разумно.

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