Разбор XML-данных в XPath - PullRequest
       1

Разбор XML-данных в XPath

0 голосов
/ 31 октября 2011

У меня есть XML-файл, подобный следующему:

<Adresses> 
    <Address1>
      <XPath>//Address/Local[001]/AddressLine1</XPath>
      <Key>1</Key>
    </Address1>
    <Address2>
      <XPath>//Address/Local[002]/AddressLine1</XPath>
      <Key>2</Key>
    </Address2>
    <Address3>
      <XPath>//Address/Local[003]/AddressLine1</XPath>
      <Key>3</Key>
    </Address3>
    <Address4>
      <XPath>//Address/Local[004]/AddressLine1</XPath>
      <Key>4</Key>
    </Address4>
    <Address5>
      <XPath>//Address/Local[005]/AddressLine1</XPath>
      <Key>5</Key>
    </Address5>
</Adresses> 

Я хочу использовать XPath в C # для анализа значений XML.В этом случае я хочу заменить Local [002], Local [003], Local [004] и Local [005] на Local [001] для элемента <XPath>.

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Ваши требования не совсем понятны.AFAIK, XPATH только унесет вас, поскольку он используется только для навигации по вашему XML-документу.Вы можете использовать его, чтобы помочь вам найти нужные элементы, но для фактических замен вам понадобится что-то еще.

Использование LINQ to XML (вместе с регулярными выражениями):

var doc = XDocument.Load(@"C:\path\to\file.xml");
var xpath = "/Adresses/*/XPath";
var query = doc.XPathSelectElements(xpath);
foreach (var element in query)
{
    var newValue = Regex.Replace(element.Value, @"Local\[\d{3}\]", "Local[001]");
    element.Value = newValue;
}

Использование XSLT может быть вариантом, но я не уверен, как использовать его здесь в этом случае.Но держу пари, что это не будет красиво (по сравнению с приведенным выше кодом).

0 голосов
/ 31 октября 2011

Вы можете использовать LINQ to XML , чтобы сделать это легко.

Вот очень быстрый пример, который я набросал:

var xml = @"<Adresses> 
    <Address1>
      <XPath>//Address/Local[00X]/AddressLine1</XPath>
      <Key>1</Key>
    </Address1>
    <Address2>
      <XPath>//Address/Local[00X]/AddressLine2</XPath>
      <Key>2</Key>
    </Address2>
    <Address3>
      <XPath>//Address/Local[00X]/AddressLine3</XPath>
      <Key>3</Key>
    </Address3>
    <Address4>
      <XPath>//Address/Local[00X]/AddressLine4</XPath>
      <Key>4</Key>
    </Address4>
    <Address5>
      <XPath>//Address/Local[00X]/AddressLine5</XPath>
      <Key>5</Key>
    </Address5>
</Adresses> ";
Console.WriteLine(xml);
var xDoc = XDocument.Parse(xml);
foreach(var elem in xDoc.Descendants("XPath")){
  var key = Convert.ToInt32((elem.NextNode as XElement).Value);
  elem.Value = string.Format("//Address/Local[{0}]/AddressLine{1}",key.ToString("000"),key);
}
Console.WriteLine(xDoc.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...