解析XML数据XPath中
我有类似下面的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]。
您可以使用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());
你的要求还不太清楚。 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可能是一种选择,但我不知道如何在这种情况下,就可以直接使用。但我敢打赌它不会很漂亮(与上面的代码相比)。
的XML是
我做到了这一点: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
你究竟想告诉我什么?我在这里显示的代码应该这样做... –
你试图完成什么*部分是造成困难? –
你想用什么替换它们? – Reddog
我想用Local [001]替换Local [002],Local [003],Local [004]和Local [005]。在发布XML时也犯了一个错误。在Local [00X]部分之后,它应该分别是/ AddressLine1,/ AddressLine2,/ AddressLine3,/ AddressLine4和/ AddressLine5,它们将保持相同。 @Reddog – ncoder