XMLツリーのすべての要素をどのように反復処理してアクセスするのですか?私が意味することは、入力が未知のXMLファイルを取得し、コード自体が要素と枝の数を知らないということです。XMLファイルを反復処理する方法
私はそのようなトピックに関する多くの答えがあったことを知っています。このソリューションは、既知の構造体xmlがどこにあるのかをコードを実装する準備ができています。今私は、反復によってexisitngノードにいくつかの要素を追加する方法
class Program
{
static void Process(XElement element)
{
if (!element.HasElements)
{
Console.WriteLine(element.GetAbsoluteXPath());
}
else
{
foreach (XElement child in element.Elements())
{
Process(child);
}
}
}}
static void Main()
{
var doc = XDocument.Load("C:\\Users\\Błażej\\Desktop\\authors1.xml");
List<string> elements = new List<string>();
Program.Process(doc.Root);
Console.ReadKey();
}
public static class XExtensions
{
public static string GetAbsoluteXPath(this XElement element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
Func<XElement, string> relativeXPath = e =>
{
int index = e.IndexPosition();
string name = e.Name.LocalName;
return (index == -1) ? "/" + name : string.Format
(
"/{0}[{1}]",
name,
index.ToString()
);
};
var ancestors = from e in element.Ancestors()
select relativeXPath(e);
return string.Concat(ancestors.Reverse().ToArray()) +
relativeXPath(element);
}
public static int IndexPosition(this XElement element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
if (element.Parent == null)
{
return -1;
}
int i = 1;
foreach (var sibling in element.Parent.Elements(element.Name))
{ // czyli patrzymy na rodzeństwo, czy występują podobne np. au_id[1], au_id[2]
if (sibling == element)
{
return i;
}
else
{
i++;
}
}
throw new InvalidOperationException
("element has been removed from its parent.");
}
:
これは私が使用しているコードのですか?それが可能だ ?
として再書き込みする必要があることに注意してください。 。 XMLDocumentまたはXPATHDocumentを使用できます。または、LINQの場合、XMLを読むことができるXDocumentを使用します。 – A3006
あなたが達成しようとしていることを正確に知るのに役立つかもしれません。 – PaulF
私はツリーxmlのすべての要素を反復するメソッドが必要です。この考え方は、xmlファイルのさまざまなブランチで汎用的にコードを動作させることです。 –