2011-10-31 128 views
0

我有类似下面的XML文件:解析XML数据XPath中

<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值。在这种情况下,我想用元素<XPath>上的本地[001]替换本地[002],本地[003],本地[004]和本地[005]。

+0

你试图完成什么*部分是造成困难? –

+0

你想用什么替换它们? – Reddog

+0

我想用Local [001]替换Local [002],Local [003],Local [004]和Local [005]。在发布XML时也犯了一个错误。在Local [00X]部分之后,它应该分别是/ AddressLine1,/ AddressLine2,/ AddressLine3,/ AddressLine4和/ AddressLine5,它们将保持相同。 @Reddog – ncoder

回答

0

您可以使用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()); 
+0

Acually,中的XPath元素值diffreent除了本地部分。这是我诚实的错误。我不想在这个元素中取代整条线。只想用Local [001]更新Local [00X]部分。谢谢@ brendan。 – ncoder

+0

不知道我可以按照您的确切问题,更新的答案应该接近您正在寻找的。 – brendan

0

你的要求还不太清楚。 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

的XML是 //地址/本地[001]/AddressLine1 //地址/本地[002]/AddressLine2 //地址/本地[003]/AddressLine3 //地址/本地[004]/AddressLine4// Address/Local [005]/AddressLine5。我正尝试将Local [002],[Local003],[Local004]和[Local005]重新映射到Local [001]。 @ Jeff Mercado – ncoder

+0

我做到了这一点:if(xpath.Contains(“// Address”)) {const string LOCAL =“// Address/XPath”; XmlDocument lDoc = new XmlDocument();如果(!dr.IsNull(“document”)) {lDoc.LoadXml(dr [“document”]。ToString()); XmlNodeList localNodes = xDoc.SelectNodes(LOCAL);如果(localNodes!= null) xpath = xpath.Replace(@“Local [\ d {3}]”,“Local [001]”); } } } – ncoder

+0

你究竟想告诉我什么?我在这里显示的代码应该这样做... –